<my code =“”>出错:赋值目标扩展为非语言对象</my>

时间:2014-12-26 21:28:51

标签: r r-faq

我收到了错误

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 个答案:

答案 0 :(得分:43)

当您尝试assign a value到不存在的变量或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

Create a variable name with "paste" in R?
How to name variables on the fly?

解决方法是使用assign

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

出现这种情况的常见情况是尝试分配数据帧列时。通常会同时尝试paste()任务的左手,即

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

这里的最佳解决方案通常是而不是诉诸getassign,但要记住我们可以使用{{1}通过字符变量引用数据框列}或[运算符:

[[

同样,您无法分配get的结果。

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

解决方案是

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

或只是

assign("x", 1)

Using get() with replacement functions处理更复杂的"x" <- 1 案例和替换函数。


使用get软件包时,意外尾随pipe operators也会导致此错误。

magrittr

另请参阅Assignment in R language,其答案详细介绍了与分配相关的一些奥秘,特别是R语言定义对Subset Assignment的描述。