2013-03-14 98 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