这是我的代码:
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
为什么会出现以下错误?
x $ ed中的错误:$运算符对原子向量无效
Answers:
从关于$
(请参阅参考资料?"$"
)的帮助文件中,您可以阅读:
$仅对递归对象有效,并且仅在下面有关递归对象的部分中讨论。
现在,让我们检查一下是否x
递归
> is.recursive(x)
[1] FALSE
递归对象具有类似列表的结构。向量不是递归的,而是原子的对象,让我们检查一下
> is.atomic(x)
[1] TRUE
因此,当应用$
到向量(非递归对象)时,会出现错误,请[
改用:
> x["ed"]
ed
2
您也可以使用 getElement
> getElement(x, "ed")
[1] 2
因为$
不适用于原子向量。使用[
或[[
代替。从帮助文件中$
:
对于原子向量,矩阵/数组和递归(类似于列表,请参见is.recursive)对象,默认方法的工作方式有所不同。$仅对递归对象有效,并且仅在下面有关递归对象的部分中讨论。
x[["ed"]]
将工作。
这里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
尽管一切正常,但是由于R环境中当前加载的一个软件包引起的冲突,您仍然会收到此错误。
因此,要解决此问题,请从R环境中分离所有不需要的软件包。例如,当我遇到相同的问题时,我执行了以下操作:
detach(package:neuralnet)
最重要的是:分离不再需要执行的所有库...,该问题将得到解决。
原子集合可通过以下方式访问 $
递归集合不是。而是[[ ]]
使用
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
Error in object$y : $ operator is invalid for atomic vectors
我尝试通过您的回答/建议进行工作,但仍未解决我的问题。也许我不明白您的最初反应。您能否尝试使用其他更完整的示例来重述您的答案?欣赏