2013-06-04 61 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

相關問題