<我的代码> 中的错误:分配目标扩展到非语言对象

Posted

技术标签:

【中文标题】<我的代码> 中的错误:分配目标扩展到非语言对象【英文标题】:Error in <my code> : target of assignment expands to non-language object 【发布时间】:2015-02-24 01:30:34 【问题描述】:

我收到了错误

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】:

当您尝试 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 &lt;- 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,但请记住,我们可以使用[[[ 通过字符变量引用数据框列运营商:

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

Using get() with replacement functions 处理get 结合替换函数的更复杂情况。


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

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

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

【讨论】:

以上是关于<我的代码> 中的错误:分配目标扩展到非语言对象的主要内容,如果未能解决你的问题,请参考以下文章

在道具分配中使用扩展运算符时React Native收到错误:“在这种环境下,分配的目标必须是一个对象

是什么导致c代码中的分段错误,跨函数的动态分配

目标c中的测试字符串扩展

添加 MaterialDesign 扩展器

Visual Studio扩展自定义命令错误:“对象与目标类型不匹配”

React 错误:类型“void”不可分配给 React.Component 中的类型“Readonly<>”