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

Ric*_*ton 28 r r-faq

我收到了错误

Error in <my code> : target of assignment expands to non-language object
Run Code Online (Sandbox Code Playgroud)

要么

Error in <my code> : invalid (do_set) left-hand side to assignment
Run Code Online (Sandbox Code Playgroud)

要么

Error in <my code> : invalid (NULL) left side of assignment
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ton 53

当您尝试将值分配给不存在的变量或R不能视为a 时,会发生这些错误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
Run Code Online (Sandbox Code Playgroud)

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


R的一个鲜为人知的特性是您可以为字符串赋值:

"x" <- 1 # same as x <- 1
Run Code Online (Sandbox Code Playgroud)

例如,如果您尝试使用更复杂的表达式构造字符串,则此方法不起作用paste.

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

看到

在R中使用"粘贴"创建变量名称?以及
如何动态命名变量?

解决方法是使用assign:

assign(paste0("x", "y"), 1)
Run Code Online (Sandbox Code Playgroud)

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

paste0("my_dataframe$","my_column") <- my_value
Run Code Online (Sandbox Code Playgroud)

通常,这里的最佳解决方案不是诉诸get或者assign记住我们可以使用[or [[运算符通过字符变量引用数据框列:

x <- "my_column"
my_dataframe[,x] <- value #or...
my_dataframe[[x]] <- value
Run Code Online (Sandbox Code Playgroud)

同样,您无法分配结果get.

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

解决方案是

assign("x", 1)
Run Code Online (Sandbox Code Playgroud)

或者干脆

"x" <- 1
Run Code Online (Sandbox Code Playgroud)

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


使用magrittr包时,意外的尾随管道操作员也可能导致此错误.

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

另请参阅R语言中赋值,其答案详细说明与赋值相关的一些奥秘,特别是R语言定义的子集赋值说明.