从使用 devtools 加载的包中设置 ReferenceClass 时,R 中的 Shiny 出错

Posted

技术标签:

【中文标题】从使用 devtools 加载的包中设置 ReferenceClass 时,R 中的 Shiny 出错【英文标题】:Error in Shiny in R when setting a ReferenceClass from a package loaded with devtools 【发布时间】:2015-11-13 09:02:30 【问题描述】:

这是一个非常具体的问题。

我有一个简单的 Shiny 应用程序,使用最新版本的 R (3.2.2)、RStudio (0.99.473),所有软件包都是最新的,在 Windows 7 和 Ubuntu 14.04 中进行了测试。同样的事情发生在两个 SO 中。

我有一个嵌入在“包”中的函数库,其中包含正确创建的说明文件。我使用 devtools 来加载这个包。所以,我非常简单的 Shiny 应用程序的第一行代码是

library("devtools")
load_all("../../RTEMP");

因为我打算在 Shiny 应用程序中使用其中一些功能。包名实际上不是 RTEMP,我临时创建这个是为了隔离问题。这个临时包在 RTEMP/R/ 中有一个文件,something.r。该文件包含一行代码:

AA <- setRefClass("AA");

所以我正在创建一个只有名称的引用类(我的原始代码依赖于这种类型的 R 对象)。我没有对包做任何事情,只是加载它。

在打开 RStudio 后第一次运行 Shiny 应用程序时,它运行良好。如果我关闭应用程序并再次打开它,我会收到以下错误消息:

ERROR: shinyjs: you cannot mix named and unnamed arguments in the same function call

奇怪的是,如果我将 Shiny 应用的开头更改为:

#library("devtools")
#load_all("../../RTEMP");
AA <- setRefClass("AA");

所以,在 Shiny 应用程序中注释包加载和设置引用类,一切正常。

当我从加载有 devtools 的包中调用 setRefClass 时会出现问题,但当我直接从 Shiny 调用它时不会。另外,我可以第一次加载它,但不能第二次加载(闪亮的窗口只是显示上面的错误消息)。

任何想法可能导致此错误?

非常感谢。

【问题讨论】:

我认为这个问题更多地与 devtools 相关,而不是 Shiny。执行 load_all 时,该函数默认尝试卸载包并再次加载。卸载函数的文档提到了 S4 类的一些错误,即它们没有正确卸载。我想知道 refClasses 是否会遇到同样的问题。在我看来,我第二次加载包时,我第一次加载的残留物可能会导致这个错误。 查看错误消息,它似乎正在尝试调用shinyjs 函数。如果加载了shinyjs,并且您对shinyjs 具有的函数进行了非命名空间函数调用,则可能会发生这种情况。例如,shinyjs 有一个函数info,所以如果你使用的包调用了info,它可能会意外到达shinyjs 版本。我刚刚更新了shinyjs github版本,还包含了错误消息中调用的函数,所以你可以尝试下载最新版本(devtools::install_github("daattali/shinyjs")),看看是什么函数导致了这个错误 谢谢,@daattali。通过您的更新,我发现问题的原因是函数removeClass - 所以我认为问题是由devtools 在第二次加载包之前调用它的unload 函数引起的。 因为我认为这实际上是devtools 中的一个错误,所以我在那里报告了一个错误,这里是link。 如果是 removeClass 方法,我的猜测是有人调用了 removeClass,而应该是 methods::removeClass 【参考方案1】:

实际上是devtools 包中的一个问题导致与shinyjs 不兼容。我提交了这个bug report,希望这不会在下一个版本中发生。

如果您在使用 Shiny 时遇到类似的错误消息,可能是其他包(或您自己的包)中的其他函数需要命名空间。

【讨论】:

这是一个在很多包中都会发生的问题,并且自 2015 年 6 月 29 日以来,它正在被检查。所以任何在 6 月 29 日之后提交给 CRAN 的包都不会出现这个问题,因为他们现在对命名空间非常严格。

以上是关于从使用 devtools 加载的包中设置 ReferenceClass 时,R 中的 Shiny 出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Chrome DevTools 的 lambda 调用中设置断点?

使用 Gulp 时如何在 IDEA 中设置 Chrome 识别的断点?

在Javascript中设置属性后重新加载页面

加载商店后如何在网格中设置值? EXTJS3

idea中设置springboot热部署

如何在 ipad 中使用 jquery 加载页面后在文本框中设置光标