plot()调用认为data.frame是原子向量

时间:2019-03-20 20:37:33

标签: r plot

我有一个data.frame irv,其中有一个感兴趣的列。 class(irv)返回“ data.frame”。

is.recursive(irv)返回TRUEis.atomic(irv)返回FALSE。在控制台中,irv$x返回感兴趣的列。 max(irv$x)还会返回适当的最大值。

在绘图调用中,我尝试使用此列的最大值设置xlim,所以我有

plot(y~x,data = subsetirv,xlab = '', ylab = '', ylim = c(0,20), 
     xlim = c(0, max(irv$x)),
     cex = 0.5, pch = 19) 

这些都是我所有的参数,以防万一有些奇怪的参数交互

但是每次抛出以下错误:

Error in irv$x : $ operator is invalid for atomic vectors

为什么当其他所有东西都声称它是数据帧时,plot()调用会认为irv是原子的?

通常,我会尝试提供可复制的数据,但是除了实际数据外,我无法重现该问题,而且我不确定如何以合理的方式共享实际数据。

我没有想到一些奇怪的互动吗?

btw,如果重要的话,正在绘制的数据是irv的子集。

-edit-我刚刚尝试过的操作是将数据框另存为其他对象名称。它最初称为irv,我保存到一个名为testdf的新对象中。这解决了问题。 irv在绘图或最大功能环境中是否存在?名称显然是个问题,但我不知道为什么。

-edit2-建议后,这是dput(head(irv))pastebin的输出的pastebin,这是str(irv)的输出:

'data.frame':   16198 obs. of  17 variables:
 $ reader     : chr  "MG" "MG" "MG" "MG" ...
 $ read       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ age        : num  2 3 4 5 6 7 8 9 10 11 ...
 $ fishid     : Factor w/ 2118 levels "2010_TNS_0135",..: 7 7 7 7 7 7 7 7 7 7 ...
 $ otorad     : num  6.15 9.52 13.47 17.32 22.28 ...
 $ year       : chr  "2010" "2010" "2010" "2010" ...
 $ readid     : chr  "2010_TNS_0153_MG_1" "2010_TNS_0153_MG_1" "2010_TNS_0153_MG_1" "2010_TNS_0153_MG_1" ...
 $ incwidth   : num  3.94 3.37 3.94 3.85 4.96 ...
 $ profflag   : chr  "good" "good" "good" "good" ...
 $ median     : num  3.85 3.82 3.78 3.77 3.78 ...
 $ upper75prob: num  4.44 4.19 3.94 3.94 4.03 ...
 $ lower25prob: num  3.58 3.65 3.67 3.5 3.56 ...
 $ IQR        : num  0.859 0.543 0.269 0.437 0.465 ...
 $ diff_flag  : num  0.0954 -0.8162 0.6171 0.1933 2.5376 ...
 $ roll_flag  : chr  "good" "good" "good" "good" ...
 $ irv        : num  3.936 -0.563 0.571 -0.09 1.104 ...
 $ irvf       : chr  "good" "good" "good" "good" ...

1 个答案:

答案 0 :(得分:2)

问题不在于您有一个名为irv的data.frame,而是您在名为irv的data.frame中有一个名为irv的列。

将公式语法与plot()一起使用时,所有参数都在您传递data=参数的data.frame上下文中进行评估。您的xlim = c(0, max(irv$x))参数已基本运行

xlim = with(irv, c(0, max(irv$x)))

因此它找到名为“ irv”的列,并且该列是原子列,因此不知道如何使用$运算符。

为避免混淆,请在函数外部预先计算该值(并确保没有共享您使用的变量名称的列

maxx <- max(irv$x)
plot(y~x,data = subsetirv,xlab = '', ylab = '', ylim = c(0,20), 
     xlim = c(0, maxx),
     cex = 0.5, pch = 19)