В первом случае функция определена в 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})