<我的代码>中的错误:赋值目标扩展到非语言对象

Error in <my code> : target of assignment expands to non-language object

提问人:Richie Cotton 提问时间:12/27/2014 更新时间:8/16/2018 访问量:79281

问:

我收到了错误

Error in <my code> : target of assignment expands to non-language object

Error in <my code> : invalid (do_set) left-hand side to assignment

Error in <my code> : invalid (NULL) left side of assignment

这是什么意思,我该如何预防?

R-常见问题

评论


答:

79赞 4 revs, 2 users 91%Richie Cotton #1

当您尝试将值分配给不存在的变量或 R 无法将其视为名称的变量时,会发生这些错误。(名称是保存变量名称的变量类型。

要重现错误,请尝试:

1:2 <- 1
## Error in 1:2 <- 1 : target of assignment expands to non-language object

1 <- 1
## Error in 1 <- 1 : invalid (do_set) left-hand side to assignment

mean() <- 1
## Error in mean() <- 1 : invalid (NULL) left side of assignment

(你能猜出这三个错误中的哪一个返回吗?NULL <- 1


R 的一个鲜为人知的功能是,您可以为字符串赋值:

"x" <- 1 # same as x <- 1

如果您尝试使用更复杂的表达式(例如粘贴)来构造字符串,则这不起作用。

paste0("x", "y") <- 1
## Error: target of assignment expands to non-language object

在 R 中使用“粘贴”创建变量名称?以及如何
即时命名变量?

对此的解决方案是使用 assign

assign(paste0("x", "y"), 1)

出现这种情况的常见情况是尝试分配给数据框列时。通常会尝试将作业的左手放在一起,即paste()

paste0("my_dataframe$","my_column") <- my_value

通常,这里的最佳解决方案不是求助于 or,而是记住,我们可以使用 or 运算符通过字符变量引用数据框列:getassign[[[

x <- "my_column"
my_dataframe[,x] <- value #or...
my_dataframe[[x]] <- value

同样,您不能将 get 的结果赋值。

get("x") <- 1
## Error in get("x") <- 1 : 
##   target of assignment expands to non-language object

解决方案是

assign("x", 1)

或者干脆

"x" <- 1

将 get() 与替换函数一起使用可以处理与替换函数结合使用的更复杂的情况。get


使用包时,意外的拖曳管道操作员也可能导致此错误。magrittr

library(magrittr)
x <- 1 %>% 
y <- 2
##  Error in 1 %>% y <- 2 : 
##   target of assignment expands to non-language object

另请参阅 R 语言中的赋值,其答案详细介绍了与赋值相关的一些奥秘,特别是 R 语言定义对子集赋值的描述。