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

use*_*875 63 r

这是我的代码:

x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
Run Code Online (Sandbox Code Playgroud)

为什么我会收到错误:

x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
Run Code Online (Sandbox Code Playgroud)

Jil*_*ina 84

从帮助文件中可以看到$(参见参考资料?"$"):

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

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

> is.recursive(x)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

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

> is.atomic(x)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

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

> x["ed"]
ed 
 2 
Run Code Online (Sandbox Code Playgroud)

你也可以使用 getElement

> getElement(x, "ed")
[1] 2
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的错误“对象 $y 中的错误:$ 运算符对于原子向量无效”我已尝试通过您的答案/建议进行工作,但尚未解决我的问题。也许我不明白你最初的反应。您能否尝试使用不同的更完整的示例重新表述您的答案?欣赏它 (2认同)

Dal*_*pus 37

你得到这个错误的原因是你有一个vector.

如果要使用$运算符,只需将其转换为data.frame.但由于在这种特殊情况下你只有一行,你还需要转置它; 否则bob,ed将成为您的行名而不是​​您的列名,这是我认为您想要的.

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

  • 使用`x < - as.list(x)`会更容易. (3认同)

tmp*_*345 12

因为$不适用于原子矢量.使用[[[代替.从帮助文件$:

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

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


San*_*mar 5

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

 x <- as.data.frame(x) 
Run Code Online (Sandbox Code Playgroud)

会为你工作。

x<-c(1,2)
names(x)<- c("bob","ed")
x <- as.data.frame(x)
Run Code Online (Sandbox Code Playgroud)

将为您提供 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))
Run Code Online (Sandbox Code Playgroud)

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