R函数参数和环境/命名空间

时间:2016-01-19 12:06:39

标签: r namespaces

我无法理解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)
}

假设xy可以引用数据框中的列 作为data参数,传递给绑定在中的变量 全球环境。

1 个答案:

答案 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"