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