【问题标题】:Calling object created within for() loop调用在 for() 循环中创建的对象
【发布时间】:2016-07-13 21:10:45
【问题描述】:

我有一个名为mergedColors 的颜色列表。从这个颜色列表中,我使用for() 循环来创建一个与每种唯一颜色对应的矩阵。到目前为止,一切正常。然后,我想在最初创建它们之后继续更改/编辑循环中的矩阵。在示例中,我尝试更改第三列的名称。但是,我不完全确定如何去做。当我尝试通过与创建它们相同的语法来调用它们时,

colnames(paste("merged",each,sep="_"))[3] = "Temp"

R 返回错误:“赋值目标扩展为非语言对象”。我应该如何调用我刚刚在循环中创建的矩阵?

样本数据:

mergedColors = c("red", "blue", "green", "red", "black", "blue", "blue", "green", "yellow", "red")
table(mergedColors)



for(each in unique(mergedColors)){ 

  assign(paste("merged",each,sep="_"), as.matrix(cbind(cars, c(each))))
  #colnames(paste("merged",each,sep="_"))[3] = "Temp"

} 

【问题讨论】:

  • 有人会告诉你使用get,但你不应该这样做。您应该返回并使用命名列表重做所有这些操作。
  • @joran 在已经使用get 得到答案之后,您发表了该评论。
  • @Hack-R 我的网页一定是刷新很慢,没看到。

标签: r


【解决方案1】:

您只需要使用 get 告诉 R 您正在粘贴的内容是指一个对象。

像这样:

tmp <- get(paste("merged",each,sep="_"))
colnames(tmp)[3] = "Temp"

> head(tmp)
     speed dist  Temp    
[1,] " 4"  "  2" "yellow"
[2,] " 4"  " 10" "yellow"
[3,] " 7"  "  4" "yellow"
[4,] " 7"  " 22" "yellow"
[5,] " 8"  " 16" "yellow"
[6,] " 9"  " 10" "yellow"

这是完整的循环:

for(each in unique(mergedColors)){ 

  assign(paste("merged",each,sep="_"), as.matrix(cbind(cars, c(each))))
  #colnames(paste("merged",each,sep="_"))[3] = "Temp"
  tmp <- get(paste("merged",each,sep="_"))
  colnames(tmp)[3] = "Temp"
  assign(paste("merged",each,sep="_"), tmp)

} 

【讨论】:

  • 但是我认为你创建了一个新矩阵。它不会改变实际矩阵的名称还是我错了?
  • @Alex 对,所以你只需要像以前一样运行assign 操作来覆盖它。我会添加完整的循环给你看。
  • @Alex 有趣。需要明确的是,此解决方案对您有用吗?它似乎产生了我想要的结果;只是想检查一下。
  • @Hack-R 这不是我的问题 ;) 但我想它有效,尽管我认为他们可能是一个更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2020-03-29
  • 2021-12-19
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多