R x $ ed中的错误:$运算符对原子向量无效


77

这是我的代码:

x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed

为什么会出现以下错误?

x $ ed中的错误:$运算符对原子向量无效

Answers:


98

从关于$(请参阅参考资料?"$")的帮助文件中,您可以阅读:

$仅对递归对象有效,并且仅在下面有关递归对象的部分中讨论。

现在,让我们检查一下是否x递归

> is.recursive(x)
[1] FALSE

递归对象具有类似列表的结构。向量不是递归的,而是原子的对象,让我们检查一下

> is.atomic(x)
[1] TRUE

因此,当应用$到向量(非递归对象)时,会出现错误,请[改用:

> x["ed"]
ed 
 2 

您也可以使用 getElement

> getElement(x, "ed")
[1] 2

1
我遇到了同样的错误, Error in object$y : $ operator is invalid for atomic vectors我尝试通过您的回答/建议进行工作,但仍未解决我的问题。也许我不明白您的最初反应。您能否尝试使用其他更完整的示例来重述您的答案?欣赏
oaxacamatt

@oaxacamatt我的答案与作为递归对象的data.frames或list有关,您正在使用vector,这就是为什么我的答案无济于事的原因。你错了,我的回答是正确的,那么你的投票无效。
Jilber Urbina

41

您收到此错误的原因是您有一个vector

如果要使用$运算符,只需将其转换为即可data.frame。但是由于在这种特殊情况下只有一行,所以还需要转置它。否则bobed它将变成您的行名,而不是您认为的列名。

x <- c(1, 2)
x
names(x) <- c("bob", "ed")
x <- as.data.frame(t(x))
x$ed
[1] 2

5
使用起来会更容易x <- as.list(x)
本·博克

是的1项目as.list会更好。我从不使用列表,所以我总是忘记它们。
Dalupus

13

因为$不适用于原子向量。使用[[[代替。从帮助文件中$

对于原子向量,矩阵/数组和递归(类似于列表,请参见is.recursive)对象,默认方法的工作方式有所不同。$仅对递归对象有效,并且仅在下面有关递归对象的部分中讨论。

x[["ed"]] 将工作。


4

这里x是一个向量。您需要使用$运算符将其转换为数据框。

 x <- as.data.frame(x) 

将为您工作。

x<-c(1,2)
names(x)<- c("bob","ed")
x <- as.data.frame(x)

将给您x的输出为:
bob 1
ed 2
并且,将给您x $ ed的输出为:
NULL
如果要将bob和ed作为列名,则需要像x <- as.data.frame(t(x)) 这样转置数据帧,因此代码变为

x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
x <- as.data.frame(t(x))

现在x $ ed的输出为:
[1] 2


1

尽管一切正常,但是由于R环境中当前加载的一个软件包引起的冲突,您仍然会收到此错误。

因此,要解决此问题,请从R环境中分离所有不需要的软件包。例如,当我遇到相同的问题时,我执行了以下操作:

detach(package:neuralnet)

最重要的是:分离不再需要执行的所有库...,该问题将得到解决。


-2

原子集合可通过以下方式访问 $

递归集合不是。而是[[ ]]使用

 Browse[1]> is.atomic(list())
 [1] FALSE

 Browse[1]> is.atomic(data.frame())
 [1] FALSE

 Browse[1]> is.atomic(class(list(foo="bar")))
 [1] TRUE

 Browse[1]> is.atomic(c(" lang "))
 [1] TRUE

R有时可能很有趣

 a = list(1,2,3)
 b = data.frame(a)
 d = rbind("?",c(b))
 e = exp(1)
 f = list(d)
 print(data.frame(c(list(f,e))))

   X1 X2 X3 X2.71828182845905
 1  ?  ?  ?          2.718282
 2  1  2  3          2.718282

4
我想你有这个倒退。LIst是递归对象,可以通过$访问,数值向量是原子的,不能。我不确定您要在这里显示什么。
本·博克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.