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

44

我收到了错误信息

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

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

1个回答

79
这些错误是在您试图为不存在的变量分配值或R无法将其视为name时发生的。(一个name是一种变量类型,它保存了一个变量名。)
为了重现错误,请尝试:
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

这种方法在你试图使用更复杂的表达式构建字符串时不起作用,例如使用 paste
paste0("x", "y") <- 1
## Error: target of assignment expands to non-language object

请看:

如何在 R 中创建带有“paste”变量名的变量?
如何动态命名变量?

解决方法是使用 assign:

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

一个常见的情况是在尝试给数据帧的列赋值时出现。通常会尝试将赋值的左侧用paste()粘合起来。

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

通常情况下,最优解决方案并不是使用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语言定义中关于子集赋值的描述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接