Как использовать с () внутри функции в R? - PullRequest
1 голос
/ 02 июля 2019

Как вызвать функцию 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 Ответ

3 голосов
/ 02 июля 2019

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