2013-06-04 63 views
0

我想设置foreach函数的形式参数。我将使用.combine参数给出一个简单的例子。设置'foreach'函数的形式参数

我写了改变功能的甲缩醛(下面的代码)

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 var没有设置!例如,声明:

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功能?

+0

我不确定更改正式参数列表是什么,但http://stackoverflow.com/questions/6547219/ how-to-bind-function-arguments描述了如何去做你想做的事情。 – zwol

+0

我看到这篇文章。这正是我的绑定函数所做的。正如史蒂夫所说,这是foreach函数的一个问题,它检查缺少的值。 – MSardelich

+0

我特指'Curry'函数(在被接受的答案的顶部),它不会*做你的绑定函数所做的事情,而且似乎更有可能在一般情况下正常工作。 – zwol

回答

2

.combine参数未在foreach函数中给出默认值。相反,foreach检查是否缺少.combine参数。您的代码为.combine提供了默认值,但如果您没有为其指定值,它仍然缺失,因此默认的组合行为不会更改。

一种解决方案是创建一个具有相同的形参作为foreach的包装功能,然后通过操纵,然后通过eval'ing返回match.call调用对象调用foreach

library(foreach) 
foreach.bind <- function() { 
    cobj <- match.call() 
    cobj[[1]] <- as.name('foreach') 
    nms <- names(cobj) 
    if (! '.combine' %in% nms) { 
     cobj[[length(cobj) + 1]] <- 'rbind' 
     names(cobj) <- c(nms, '.combine') 
    } 
    eval(cobj) 
} 
formals(foreach.bind) <- formals(foreach) 

此修改默认的结合行为,同时仍然允许您指定您自己的组合功能:

> foreach.bind(i=1:3) %do% c(1,i) 
     [,1] [,2] 
result.1 1 1 
result.2 1 2 
result.3 1 3 
> foreach.bind(i=1:3, .combine='c') %do% c(1,i) 
[1] 1 1 1 2 1 3 
+0

感谢您的评论。可惜的是,嵌套函数在我的情况下不起作用。我必须比这更一般... – MSardelich

+0

请解释为什么“嵌套函数不起作用”。 – zwol

相关问题