R软件包“Formula”中的警告信息

4

当使用Formula包中的Formula()as.Formula()时,我收到一个警告消息。它似乎不影响功能,但我一直无法理解它的来源。

我正在使用Formula包更新多部分公式(用于AER包中的ivreg(),但与问题无关)。在对formula对象使用Formula()as.Formula()后,我运行的下一行代码会产生一个警告消息。我查看了文档和GitHub仓库,但仍无法理解其来源。

library(Formula)
f1 <- y ~ x1 + x2 | z1 + z2 + z3
F1 <- Formula(f1)
class(F1)

> class(F1)
[1] "Formula" "formula"
Warning message:
In is.name(callee) && length(object) > 20 :
  'length(x) = 2 > 1' in coercion to 'logical(1)'

要明确的是,并非专门使用class(F1)会产生此警告。例如:
> F1 <- Formula(f1)
> print("lol")
[1] "lol"
Warning message:
In is.name(callee) && length(object) > 20 :
  'length(x) = 2 > 1' in coercion to 'logical(1)'

我已经给软件包作者发了电子邮件。

该问题似乎与其他软件包无关:

> (.packages())
[1] "stats"     "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"   

然而,在RGui中未重现警告信息,所以可能与RStudio有关(?)

1
这对我来说无法再现。您是否尝试在没有其他附加包的纯R会话中尝试过?具体而言,触发警告的代码 is.name(callee) && length(object) > 20 似乎不是来自基本的R或者Formula...至少我在快速搜索中找不到它。 - Achim Zeileis
谢谢!我已经尝试重新安装并在没有其他包加载的情况下运行(除了默认值),但我仍然收到相同的警告。但是,在RGui而不是RStudio中执行时,不会返回警告。 - Jonathan
1
好的,谢谢,这很有帮助。问题来自于.rs.sanitizeCall()。它似乎不是很关键,但我建议向RStudio报告此问题。我还添加了rstudio标签。 - Achim Zeileis
@AchimZeileis,你是怎么做到的?非常尊敬! - Isaiah
2
考虑到问题仅在RStudio中出现,自然会怀疑错误发生在tools:rstudio的某个地方。我使用了options(warn = 2)将警告转换为错误,然后在触发问题后使用了traceback()。这显示了调用堆栈,我可以快速定位问题。请参见我现在发布的答案,其中解释了更多细节。 - Achim Zeileis
1个回答

4
警告是以下方式触发的:当在RStudio中创建对象时,将触发tools:rstudio中的.rs.describeObject()函数以获取有关对象的信息。其中,它使用了.rs.sanitizeCall()函数,该函数包含以下行:
long <- is.name(callee) && length(object) > 20

因此,这假设length()返回一个单一的数字。不幸的是,对于Formula()对象来说并非如此。
f <- Formula(y ~ x | z)
length(f)
## [1] 1 2

因此,Formula包无法避免警告的发生,除非破坏其已存在近1.5十年的length()方法的行为。

事后看来,使length()方法以这种方式运作可能不是最佳决策。 这甚至出现在基础R中官方?length文档中:

警告:

软件包作者编写了返回长度不为一(“Formula”)的结果并返回类型为'double'('Matrix')的向量的方法,即使具有非整数值(早期版本的'sets')。 当返回可以表示为整数的单个双精度值时,将其作为长度为一的整数向量返回。

避免此问题的一种方法是使用

`length(object)[1L] > 20`


`any(length(object) > 20)`

.rs.sanitizeCall()中,我建议将此问题报告给RStudio开发人员。


1
感谢您抽出时间。我已经在RStudio社区发布了这个问题。希望他们能够解决它。https://community.rstudio.com/t/warning-in-rs-sanitizecall/151957 - Jonathan
感谢您抽出时间进行报告和重新发布! - Achim Zeileis
1
遇到了同样的问题。我在rstudio的github存储库https://github.com/rstudio/rstudio/issues/12409上提交了一个问题,链接到这个答案和社区转帖。 - Billy34
谢谢,很棒你提到了报告这类问题的适当渠道 ^^ - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接