【问题标题】:target of assignment expands to non-language object赋值目标扩展到非语言对象
【发布时间】:2017-04-11 16:02:29
【问题描述】:

我想在 R 中使用循环进行一些计算。

我尝试assign,但仍然无法正常工作。

谁能给我一个关于如何在 R 中设置正确变量的提示,好吗?

# My data
data <- read.table(textConnection("
              a1       a2       
a1    1.00000000  0.4803088
a1    0.48030878  1.0000000 

"), header = TRUE)

no <- 2

for (k in 1:no){

  paste0("dat.",k)  <- aggregate(data[,c(paste0("a",k),paste0("b",k), paste0("b",k))],list(data$id),mean)
  paste0("cor.",k) <- cor(paste0("dat.mean.",k),use = "complete.obs")   

  paste0("cal.",k) <- as.data.frame(paste0("dat.mean.",k)) 
  paste0("lm.",k) <- lm(paste0("a",k) ~ paste0("b",k),data = paste0("lm.cal.",k))

}

【问题讨论】:

  • paste0() 返回一个字符值。您不能为字符赋值(即"apple"&lt;-3 在R 中没有意义)。您是否需要这些变量在循环后持续存在?
  • 谢谢,你介意给我一个简单的例子吗?然后我可以按照你的提示完成它。
  • @MrFlick 嗯。 "apple"&lt;-3 在 R 中非常有意义,并且成功执行。我完全同意 R 之外没有任何意义,但 R 很愚蠢并且不同意。
  • @KonradRudolph 好点。愚蠢的变量引用。有没有更好的方法来解释为什么这不起作用。
  • @MrFlick 不幸的是,不,正是由于变量引用。因此,R 中的分配规则非常不一致——至少在你理解f(something, ...) &lt;- value 扩展为什么之前,这需要对 R 有深入的了解。最简单的方法可能是说赋值必须是一个变量,或者有一个变量作为其最左边的子表达式部分(在函数名之后)。

标签: r


【解决方案1】:

我不确定您来自哪种语言(也许是 SAS?),但 R 是一种适当的函数式编程语言,不使用宏之类的东西来自动执行任务。这是解决问题的更类似于 R 的方法

no <- 2
results <- lapply(1:no, function(k) {

  # use aggregate function to make correlation calculation. 

  this_dat_mean  <- aggregate(data[,c(paste0("y", c("f","p","c"), "_",k))], list(data$id), mean)
  this_cor <- cor(this_dat_mean, use = "complete.obs") 
  #write.table(this_cor, "file_path", row.names=T, col.names=T, quote=F)

  # calculate the lm

  this_lm_cal <- as.data.frame(this_dat_mean)
  this_lm <- lm(reformulate(paste0("yc_",k), paste0("yf_",k)), data = this_lm_cal)
  #write.table(this_lm, "file_path2", row.names=T, col.names=T, quote=F)

  list(lm=this_lm, cor=this_cor)
})

请注意,我们使用一个函数来迭代感兴趣的输入。这个函数有一堆局部变量。我们可以返回要从函数中保留的值列表。我们可以通过查看来了解它们

 results[[1]]$lm 
 results[[2]]$cor

例如。最好在 R 中创建一个(可能命名的)值列表,而不是创建一堆类似命名的变量。

lm 模型不是 data.frame,因此您不能使用 write.table。不知道目标是什么。

【讨论】:

  • 我不使用 rstudio,所以我不确定你在说什么。您现在看不到的具体是什么?
【解决方案2】:

对于您的用例,我赞同 MrFlick 的观点并建议重写您的代码。

但是,由于有时我自己在某些情况下更喜欢动态生成的变量,而 R 是混乱的,并且确实允许您以选择性的方式这样做(有些东西有效,有些无效),我想简要地向您解释一下:

> k=4
> paste0("lm.", k)
[1] "lm.4"

> paste0("lm.", k) <- 1515
Error in paste0("lm.", k) <- 1515 : 
  target of assignment expands to non-language object

> assign ( paste0("lm.", k) , 1515 )

> paste0("lm.", k)
[1] "lm.4"

> eval(parse(text = paste0("lm.", k) ))
[1] 1515

> str(eval(parse(text = paste0("lm.", k) )))
 num 1515

> str(paste0("lm.", k) )
 chr "lm.4"

总而言之:每次使用胶合变量时,都必须通过 eval/parse 引用它。请记住,&lt;- 不能作为操作员使用 - 请使用 assign()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2015-02-24
    • 2012-05-29
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多