如何将函数分配给应该通过粘贴函数命名的变量?

时间:2012-11-07 15:11:18

标签: r eval

  

可能重复:
  How to name variables on the fly in R?

我有10个类型列表对象,名为:list1list2,...,list10。我想通过FUN循环使用我的函数for的输出来替换这些列表变量的第一个索引:

for (i in 1:10){
  eval(parse(test=(paste("list",i,sep=""))))[[1]] <- FUN()
}

但这不起作用。我也以这种方式使用了lapply,但又错了:

 lapply(eval(parse(text=(paste("list",i,sep=""))))[[1]], FUN)

任何意见都将不胜感激。

2 个答案:

答案 0 :(得分:4)

这是FAQ 7.21。该常见问题解答中最重要的部分是最后一部分说不要这样做,而是将所有内容放入列表并在列表中操作。

您可以使用以下代码将对象放入列表中:

mylists <- lapply( 1:10, function(i) get( paste0('list',i) ) )

然后你可以使用以下代码进行替换:

mylists <- lapply( mylists, function(x) { x[[1]] <- FUN()
  x} )

现在,如果要保存所有列表或删除所有列表,只需要一个对象就可以使用,而不是再次遍历名称。如果您想对每个列表执行其他操作,那么您只需在一个简单的步骤中使用lapply或sapply就可以在整个列表中使用,而无需担心循环。如果需要,可以将列表的元素命名为与原始名称匹配,并以这种方式访问​​它们。将所有感兴趣的内容保存在单个列表中也可以使您的代码更安全,更不可能意外地覆盖或删除其他对象。

答案 1 :(得分:2)

你可能想要像

这样的东西
for (i in 1:10) {
  nam <- paste0("list", i)  ## built the name of the object
  tmp <- get(nam)           ## fetch the list by name, store in tmp
  tmp[[1]] <- FUN()         ## alter 1st component of tmp using FUN()
  assign(nam, value = tmp)  ## assign tmp back to the current list
}

作为循环。