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

How to use with() within a function in R?

如何在函数内调用函数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 

在第一种情况下,函数是在 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 重置了传递给它的函数的环境。同样,避免所有这些并发症可能更好。

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