如何在函数内调用函数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
答案 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重置传递给它的函数的环境。同样,最好避免所有这些并发症。
library(proto)
withLapply = function(x, FUN){
with(x,
lapply(x, proto(FUN = FUN)[["FUN"]]))
}
withLapply(dfTest, function(i){a})