什么是"类型'闭包的对象'不是子集"错误的闪亮?

Joh*_*aul 11 r shiny

我有一个闪亮的应用程序,当我运行它时,我得到一个错误说,一个object of type ‘closure’ is not subsettable.那是什么,我该如何解决?

注意:我写了这个问题,因为这出现了很多,而且可能的欺骗要么不shiny相关,要么不具体,以至于答案广泛适用并不明显.

Joh*_*aul 29

另请参阅此问题,该问题涵盖了非Shiny上下文中的此错误.

如何解决这个问题:

这是闪亮应用程序中非常常见的错误.这通常在您创建对象(如a list)data.framevector使用该reactive()函数时出现 - 也就是说,您的对象会对某种输入做出反应.如果这样做,当您之后引用对象时,必须包括括号.

例如,假设你data.frame像这样反应:

MyDF<-reactive({ code that makes a data.frame with a column called “X” })
Run Code Online (Sandbox Code Playgroud)

如果您希望参考data.frame并调用它MyDF,MyDF$X您将收到错误消息.相反它应该是MyDF()或者MyDF()$X您需要将此命名约定与您使用的任何对象一起使用reactive().

为什么会这样:

当你制作一个被动对象时,例如a data.frame,使用reactive()它很容易将它想象为任何其他非反应性对象data.frame并相应地编写代码.然而,你所创造的并不是真的是一个data.frame.相反,你所做的是以函数的形式发出的指令,它告诉我们如何在需要的data.frame时候制作它.如果您希望实际使用此函数来获取data.frame必须使用括号,就像您在R中的任何其他函数一样.如果您忘记使用括号,R认为您正在尝试使用函数的一部分并为您提供错误.尝试输入:

plot$x
Run Code Online (Sandbox Code Playgroud)

在命令行,你会得到同样的错误.

当您的应用启动时,您可能无法立即看到此错误.反应对象具有所谓的"懒惰"评估.在某些输出需要它们之前,不会对它们进行评估.因此,如果您data.frame仅用于创建绘图,则data.frame在用户第一次看到绘图之前不会存在.如果应用程序启动时,用户需要单击按钮或更改选项卡以查看绘图,则在data.frame此情况发生之前不会评估代码.一旦发生这种情况,那么只有这样才会闪亮地使用输入的当前值来运行构造data.frame绘图所需的函数.如果您忘记使用括号,那么闪亮时会出现错误.请注意,如果输入发生变化,但用户没有查看绘图,那么data.frame在用户再次查看绘图之前,不会重新运行该功能.