我有一個大約 250 行的作業函式,一個簡化版本:
myfunction <- function(x){
WithoutNA <<- x[!(is.na(x$Height)),]
Heavy <- WithoutNA[WithoutNA$Weight >= "150",]
Light <- WithoutNA[WithoutNA$Weight < "150",]
HL <<- Heavy[Heavy$FurColor=="light_Brown",]
HD <<- Heavy[Heavy$FurColor=="Dark_Brown",]
LL <<- Light[Leavy$FurColor=="light_Brown",]
LD <<- Light[Leavy$FurColor=="Dark_Brown",]
}
所以這個函式將給出 4 個不同的資料幀,不包括沒有高度的行,用重量和毛皮顏色分開我遇到的問題是,如果我第二次在兩個不同的資料幀上使用這個函式,它當然會覆寫它創建的 4 個資料幀第一次使用該功能。
如果我輸入:
myfunction(Horse)
myfunction(Pony)
我想要 8 個資料幀:HL_Horse、HD_Horse、LL_Horse、LD_Horse、HL_Pony、HD_Pony、LL_Pony 和 LD_Pony
但我似乎無法弄清楚如何將資料框名稱放入我新生成的資料框名稱中。甚至可以制作“可變”資料框名稱嗎?
uj5u.com熱心網友回復:
這整個概念是有缺陷的。R 是一種(主要)函式式編程語言,用戶不希望有副作用,尤其是在呼叫環境中(覆寫)寫入物件。一個更好的主意是讓您的函式回傳一個資料框串列。
出于多種原因,串列比直接寫入呼叫環境要好。它們避免弄亂全域作業區,它們可以被迭代,它們的元素可以命名或未命名,它們可以嵌套,它們可以轉換為環境,它們可以充當容器以允許函式回傳多個物件 - 只是就像你的例子一樣。
使用像你這樣的函式的標準 R 方法是這樣的:
myfunction <- function(x){
WithoutNA <- x[!(is.na(x$Height)),]
Heavy <- WithoutNA[WithoutNA$Weight >= "150",]
Light <- WithoutNA[WithoutNA$Weight < "150",]
HL <- Heavy[Heavy$FurColor=="light_Brown",]
HD <- Heavy[Heavy$FurColor=="Dark_Brown",]
LL <- Light[Light$FurColor=="light_Brown",]
LD <- Light[Light$FurColor=="Dark_Brown",]
return(list(HL = HL, HD = HD, LL = LL, LD = LD))
}
現在,如果我們給它一些玩具資料:
df <- data.frame(Height = c(2, 2, 2, 2),
Weight = c(100, 100, 200, 200),
FurColor = rep(c("light_Brown", "Dark_Brown"), 2))
horse <- myfunction(df)
pony <- myfunction(df)
我們可以通過執行以下操作輕松訪問 8 個資料幀中的每一個:
horse$HL
#> Height Weight FurColor
#> 3 2 200 light_Brown
pony$LD
#> Height Weight FurColor
#> 2 2 100 Dark_Brown
請注意,訪問每個資料框所涉及的字符數與每個命名資料框的字符數相同,但您現在擁有將資料框安全且邏輯地存盤為串列的所有其他好處。
如果您想讓您的全域作業區更加整潔,您甚至可以嵌套串列,以便您的所有資料框都在一個主串列中。例如,你可以有:
equines <- list()
equines$horse <- myfunction(df)
equines$pony <- myfunction(df)
現在您的全域作業區中只有一個物件,但您可以以一致且易于記憶的方式訪問每個資料框,例如
equines$pony$HL
#> Height Weight FurColor
#> 3 2 200 light_Brown
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340013.html
上一篇:R日期比較使用回圈
