使用循环中的字符串作为R中函数命令和变量名称的一部分

时间:2016-09-13 12:12:03

标签: r

如何使用来自循环的字符串 - 生成新变量
- 作为功能命令的一部分
- 作为职能的论点 - 作为if语句的一部分
在R?

具体来说,作为一个例子(代码显然不起作用,但我希望有一些不易理解的东西),

list_dist <- c("unif","norm")
for (dist in list_dist){
    paste("rv",dist,sep="") = paste("r",dist,sep="")(100,0,1)
    paste("meanrv",dist,sep="") = mean(paste("rv",dist,sep=""))
    if (round(paste("meanrv",dist,sep=""),3) != 0){
        print("Not small enough")
    }
}

注意:这是一个例子,我确实需要使用一种循环来避免编写大型脚本。

我设法使用上面示例中的字符串,但只使用eval / parse / text / paste并将整个语句(即整个“line”)组合在paste中,而不是只粘贴在varname部分或函数中部分,它使代码难看,难以辨认,编码效率低下。

我见过的类似问题的其他可用回复并不具体,如何处理循环中字符串的这种用法。

我确信必须有一种更有效和灵活的方式来解决这个问题,就像其他一些语言一样。

提前致谢!

2 个答案:

答案 0 :(得分:3)

抵制以编程方式创建变量名称的诱惑。相反,将数据正确地构建到列表中:

list_dist = list(unif = runif, norm = rnorm)
distributions = lapply(list_dist, function (f) f(100, 0, 1))
means = unlist(lapply(distributions, mean))
# … etc.

正如您所看到的,通过使用列表函数,这也消除了循环。

您的最后一步也可以进行矢量化:

if (any(round(means, 3) != 0))
    warning('not small enough')

答案 1 :(得分:0)

试试这个:

list_dist <- list(unif = runif,norm = rnorm)
for (i in 1:length(list_dist)){
    assign(paste("rv",names(list_dist)[i],sep=""), list_dist[[i]](100,0,1))
    assign(paste("meanrv",names(list_dist)[i],sep=""),mean(get(paste("rv",names(list_dist)[i],sep=""))))
    if (round(get(paste("meanrv",names(list_dist)[i],sep="")),3) != 0){
        print("Not small enough")
    }
}