Я пытаюсь установить формальные аргументы функции foreach. Я приведу простой пример с использованием аргумента .combine.
Я написал общую оболочку, которая меняет формальные данные функции (код ниже)
bind<-function(FUN,args.new) {
args.all<-formals(FUN)
args.all[names(args.all) %in% names(args.new)]<-args.new
FUN.tmp<-FUN
formals(FUN.tmp)<-args.all
FUN.tmp
}
Итак, я меняю форму функции foreach
library(foreach)
foreach.bind<-bind(foreach,list('.combine'='rbind'))
когда я проверяю новые формы, я получаю (как и ожидалось):
> formals(foreach.bind)
$...
$.combine
[1] "rbind"
$.init
$.final
NULL
$.inorder
[1] TRUE
$.multicombine
[1] FALSE
$.maxcombine
if (.multicombine) 100 else 2
$.errorhandling
c("stop", "remove", "pass")
$.packages
NULL
$.export
NULL
$.noexport
NULL
$.verbose
[1] FALSE
>
но когда я вызываю foreach.bind, все работает так, как будто переменная .combine не установлена! Например, заявив:
a<-function(x) c(1,x)
и звонит:
> foreach.bind(i=list(1,2,3)) %do% a(i)
[[1]]
[1] 1 1
[[2]]
[1] 1 2
[[3]]
[1] 1 3
>
как я уже сказал, параметр вроде .combine формально не задан.
С другой стороны, если я вызываю исходную функцию, она срабатывает:
> foreach(i=list(1,2,3),.combine='rbind') %do% a(i)
[,1] [,2]
result.1 1 1
result.2 1 2
result.3 1 3
>
В любом случае, кто-нибудь может мне объяснить, что происходит в этом случае? или предоставить мне другие способы «привязать» функцию foreach?
Curry
(в самом верху принятого ответа), которая не выполняет то, что делает ваша функция привязки, и которая, похоже, с большей вероятностью будет работать правильно в целом. - person zwol   schedule 04.06.2013