如何在R函数中使用with()?

时间:2019-07-02 12:24:39

标签: r function with-statement

如何在函数内调用函数with()

该示例似乎无用,但指出了问题所在。 虽然这个工作正常:

dfTest <- data.frame( a = 1:10)
with(dfTest, lapply(dfTest, FUN = function(i){a}))
$a
 [1]  1  2  3  4  5  6  7  8  9 10

嵌入在函数中不会:

withLapply = function(x, FUN){
   with(x,
        lapply(x, FUN))
}
withLapply(dfTest, FUN = function(i){a})
  Error in FUN(X[[i]], ...) : object 'a' not found 

1 个答案:

答案 0 :(得分:3)

在第一种情况下,函数是在with内定义的,因此其中的自由变量将引用with,但是在第二种情况下,函数是在with外部定义的,因此自由变量将引用定义了它的环境中的对象,而不是with的对象。通常,最好不要一开始就这样做,但是如果必须这样做,它将重新定义FUN的环境,以便它可以工作。

# not recommended but it will make the code work
withLapply = function(x, FUN){
   with(x,
        lapply(x, {environment(FUN) <- environment(); FUN}))
}
withLapply(dfTest, function(i){a})

proto

这也起作用,因为proto重置传递给它的函数的环境。同样,最好避免所有这些并发症。

library(proto)
withLapply = function(x, FUN){
   with(x,
        lapply(x, proto(FUN = FUN)[["FUN"]]))
}
withLapply(dfTest, function(i){a})