我收到了错误
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)
看到
解决方法是使用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语言定义的子集赋值说明.