2013-03-14 70 views
-2

我正在寫一個函數,其中一個或多個參數是由函數內的循環生成的向量。
對於前:使用函數內的參數調用函數

myfunc<-function(rep, n, arm1, arm2) 
    { 
    for(i in 1:rep) 
    { 
    x<-rnorm(n,0,4) 
    y<-rnorm(n,0,5) 
    res[i]<-t.test(arm1,arm2) 
    } 
    return(res) 
    } 

現在我想調用的函數作爲

 myfunc(rep = 10, n=10, arm1 = x, arm2 = x) or 
    myfunc(rep = 10, n=10, arm1=x,arm2 = y) 

的想法是比較不同的武器。

希望我已經清楚地說明了我的問題。

非常感謝您的幫助。

+3

你的arm1和arm2參數似乎並沒有在你的函數中使用。你爲什麼不刪除它們並使用't.test(x,y)'? – juba 2013-03-14 11:13:37

+1

什麼是arm1/arm2?爲什麼你聲稱他們是在循環中產生時,他們不是? arm1/2是否應該在生成x和y方面發揮作用?請澄清。 – ndoogan 2013-03-14 12:00:35

回答

1

讓我們來看看,如果我得到了它......

你想運行rep測試,每一個都具有n正常隨機變元2個vetors。而且你希望能夠改變參數......坦率地說,這不是編程的最佳方式。但是,我會盡力幫助你。首先要做的事情是:在創建變量之前,你不能指定res的結果的任意位置。所以我會將res <- list()添加到您的代碼中。 t.test也返回更多信息,因此它必須附加到list對象,並帶有雙方括號。

現在,對於參數,您必須讓R理解arm符號參數,要在函數環境內進行評估。所以你必須使用substitute捕捉到它的表達,它傳遞給eval功能:

myfunc<-function(rep, n, arm1, arm2) 
{ 
res <- list() ### 
for(i in 1:rep) 
{ 
    x<-rnorm(n,0,4) 
    y<-rnorm(n,0,5) 
    res[[i]]<-t.test(eval(substitute(arm1)),eval(substitute(arm2))) ### 
} 
return(res) 
} 

嘗試...

一個更好的辦法來做到這一點如下:

newfunc <- function(rep, n, sd1, sd2) 
{ 
lapply(1:rep, function(.) t.test(rnorm(n,0,sd1), rnorm(n,0,sd2))) 
} 

現在sd1sd2是標準偏差參數。

+0

謝謝,它工作。也感謝更優雅的編碼.. – user2169430 2013-03-14 15:00:01