我无法理解R如何处理环境。在 特别是,我想了解如何将数据帧传递给 函数,并使用该数据框的命名列作为参数。
以下是一个示例数据框:
DF <- data.frame(pets = c("puppies", "kitties"),
treats = c("kibble", "catnip"))
我能做到:
paste(DF$pets, "like", DF$treats)
得到一个向量通知我幼犬喜欢粗磨,和 像猫薄荷一样的小猫。到目前为止,非常好。
我可以将它包装在一个函数中:
f <- function(x, y) {
paste(x, "like", y)
}
允许我使用以下任一项获得相同的输出:
f(x = DF$pets, y = DF$treats)
with(DF, f(x = pets, y = treats))
那太棒了,但我想知道的是怎么做
写一个函数g
,这样我就可以用它来调用它:
g(x = pets, y = treats, data = DF)
g
需要看什么样?
g <- function(x, y, data = what_do_i_do_here) {
## how do I set up the environment so that function g refers
## to x and y in the dataframe passed to the data argument?
paste(x, "like", y)
}
假设x
和y
可以引用数据框中的列
作为data
参数,或传递给绑定在中的变量
全球环境。
答案 0 :(得分:1)
我强烈建议您保持简单并使用引号来引用列。然后你的问题很快得到解决:
g <- function(x, y, df) {
paste(df[,x], "like", df[,y])
}
# This works
g("pets","treats",DF)
[1] "puppies like kibble" "kitties like catnip"
也可以不带引号传递它们,但是解决方案变成了交互式功能,您的数据需要是data.table
:
g2 <- function(x,y,df){
x <- eval(substitute(x),df, parent.frame())
y <- eval(substitute(y),df, parent.frame())
paste(df[,x], "like", df[,y])
}
# This works given DF is a data.table
library(data.table)
DF <- data.table(DF)
g2(pets,treats,DF)
[1] "puppies like kibble" "kitties like catnip"