【问题标题】:plot() call thinks that data.frame is atomic vectorplot() 调用认为 data.frame 是原子向量
【发布时间】:2019-03-20 20:37:32
【问题描述】:

我有一个 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 是原子的?

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

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

顺便说一句,正在绘制的数据是 irv 的一个子集,如果这很重要的话。

-edit- 我刚刚尝试的是将数据框保存为不同的对象名称。它最初名为irv,我保存到一个名为testdf 的新对象中。这解决了这个问题。 irv 在 plot 或 max 函数环境中是什么东西?名字显然是个问题,但我不知道为什么。

-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" ...

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。我对编辑感到困惑,当变量在您的代码中命名为df 或者是irv 时,问题是什么?从你的描述来看,这听起来像是一个错字。
  • 就像我说的,除了我的真实数据,我无法重现问题,并且不知道共享真实数据的好/简单的方法。我自始至终都称它为 df,因为我不认为/不知道实际名称很重要,并且我试图以尽可能简单的方式解释问题,并且我认为真实的对象名称只会不必要地使文本混乱。但是,当我尝试更改名称时,我意识到名称显然很重要,并且问题仅在对象被称为 irv 时才出现。我会更新以反映这一点
  • 您可以使用dput(head(irv))分享部分数据。同样重要的是要分享str(irv)的输出
  • @Brian 编辑以根据要求添加这些内容。

标签: r plot


【解决方案1】:

问题不在于你有一个名为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) 

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2012-12-05
    • 2023-03-28
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多