【发布时间】:2017-03-26 19:13:13
【问题描述】:
我在从我的 for 循环中创建的变量中调用列表中的对象时遇到了一些问题。
for (i in 1:10)
{
#create variables and run through function
varName<-paste("var",i,sep="")
assign(varName, rnmf(data, k=i, showprogress=FALSE))
#create new variable using object 3 from varName output
varNF<-paste("varNF",i,sep="")
assign(varNF, (data-varName[[3]])^2)
}
我的问题是我的 for 循环的第二部分。我正在尝试使用我的第一个创建变量的输出中的第三个对象来计算我的第二个变量。如果我使用varName[[3]],我会得到"subscript out of bounds",如果我使用varName$fit,我会得到"$ operator is invalid for atomic vectors"。
看起来我的第二部分中的 varName 没有调用我正在创建的递增 varName(var1、var2、var3 等),而是调用了实际的变量 varName。为了解决这个问题,我尝试了
assign(varNF, (data-get(paste("var",i,"[[3]]",sep="")))^2)
这给了我错误"object 'var1[[3]]' not found"。但是,如果我只是在我的 R 控制台中调用 var1[[3]],它确实存在。我不太确定从这里去哪里。任何帮助都会很棒!
【问题讨论】:
-
我认为您正在寻找
get,但assign在for循环中的使用让我畏缩。如果您提供一些上下文,还有更好的方法。 -
基本上,我有大约 200 个变量需要创建并通过我的函数发送。在每个新创建的变量中都有一个对象列表,我需要在其中使用一个(第三个)来创建另一个新变量。我遇到的唯一问题是从第一个新变量中的对象列表中调用对象
-
varName在此处存储一个字符串,它是变量的名称,因此如果您调用它,您将得到该字符串 ("var1"),而不是变量var1。为此,您需要get(varName)[[3]]。不过,这仍然是一个不好的方法;最好将数据构造在单个 data.frame 或列表中,这样它本质上是可迭代的。此外,无论如何,分组和重塑将使很多迭代变得无关紧要。 -
我不确定为什么这不是一个好方法。有没有一种更简单/更好的方法来创建大量变量,并通过我的函数而不是 for 循环运行每个变量?只需 2 行代码,它就可以满足我的需求。
-
您会很快发现
for循环(至少在未预分配的情况下)在 R 中很慢。它们也不是很容易阅读,会导致类似您遇到的问题拿到。assign是一个非常强大的功能,但在大多数情况下应该避免使用,因为除非您故意使用该语言(大多数人很少这样做),否则这表明您的代码结构不合理。
标签: r