如何使用来自循环的字符串
- 生成新变量
- 作为功能命令的一部分
- 作为职能的论点
- 作为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部分或函数中部分,它使代码难看,难以辨认,编码效率低下。
我见过的类似问题的其他可用回复并不具体,如何处理循环中字符串的这种用法。
我确信必须有一种更有效和灵活的方式来解决这个问题,就像其他一些语言一样。
提前致谢!
答案 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")
}
}