【问题标题】:R 'object XX not found' error thrown inside function, but not in scriptR'object XX not found'错误在函数内抛出,但不在脚本中
【发布时间】:2013-05-21 17:12:25
【问题描述】:

我对 R 比较陌生,所以如果这个问题有点愚蠢,我深表歉意。

我正在调用外部包中的函数('mmlcr',尽管我认为这与我的问题没有直接关系),并且所需的输入(数据)之一是 data.frame。我使用以下方法(为说明而简化)从各种数据组成 data.frame:

    #id, Time, and value are vectors created elsewhere in the code.
    myData = data.frame(a=id, b=Time, c=value)  
    out <- mmlcr( input1, input2, data=myData, input4)

哪个会引发错误:

Error in is.data.frame(data) : object 'myData' not found

调试器指示在 mmlcr() 调用期间抛出了此错误。

然后我在 mmlcr() 调用之前添加了一个 print(ls()),并且输出确认“myData”在我的函数工作区中;进一步 is.data.frame(myData) 返回 TRUE。因此,似乎“myData”已成功创建,但由于某种原因,它没有正确传递到 mmlcr() 函数中。 (评论此行不会引发任何错误,所以我很确定这是有问题的行)。

然而,当我将完全相同的代码放入脚本(即不在功能块中)时,不会引发此类错误并且输出与预期一致。因此,我认为会出现一些范围界定问题。

我尝试了两种分配方法:

myData = data.frame(a=id, b=Time, c=value)  
myData <- data.frame(a=id, b=Time, c=value)  

两者都给我同样的错误。我承认我并不完全理解 R 中的范围模型(我已经阅读了 = 和 认为我明白了,但我不确定)。

如果您能提供任何建议,我们将不胜感激。

【问题讨论】:

  • 我认为您需要发布您的功能作为对您的问题的更新,但您几乎可以肯定是正确的,问题是范围界定。让我确认一下:它作为一个函数工作,而不是作为一个脚本?通常情况会相反。无论如何,向我们展示一个最小的工作/不工作示例。
  • 我问的原因是题主和'However'开头的段落冲突。
  • 该错误是在函数内调用 mmlcr() 时发生的,而在脚本内不会发生。我不确定这与问题标题有何冲突。
  • 你是对的:我看错了两次!

标签: r scope


【解决方案1】:

MMLCR 现在已被弃用,您应该寻找一些替代方案。我没有过多地研究它,而是通过一个旧的 repo 进行了调查,并找到了罪魁祸首:

m <- eval(m, data)

在函数mmlcr.default 中。这不好的原因有很多,但范围界定是最重要的。 R 的 subset.data.frame 函数存在此问题,请参阅我的 old SO question。与其修改源代码,我会找到一种方法来使用 forrepeatwhile 循环的子例程来执行您的函数。

【讨论】:

  • 啊,看看 mmlcr.default,我明白你的意思了。正如我在我的问题中所说,我是 R 新手,但我来自 Matlab 背景,鼓励不惜一切代价避免 eval() ,正是因为其中的范围问题。所以我对这条线引发了问题并不感到惊讶。我将寻找 mmlcr() 的替代品,尽管我之前很难找到其他类似的包。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2012-03-20
  • 2018-12-29
  • 2012-09-05
  • 2012-12-14
  • 2021-02-17
  • 1970-01-01
相关资源
最近更新 更多