我收到了错误
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
这是什么意思,我该如何预防?
答案 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
这里的最佳解决方案通常是而不是诉诸get
或assign
,但要记住我们可以使用{{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的描述。