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

时间:2016-11-16 03:50:28

标签: r shiny

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

注意:我写了这个问题,因为这出现了很多,而且可能的愚蠢要么不是shiny相关的,要么具体说明答案广泛适用并不明显

1 个答案:

答案 0 :(得分:26)

另请参阅this question,其中包含非闪亮背景下的此错误。

如何解决此问题:

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

例如,假设您像这样制作一个被动的data.frame

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

如果您希望引用data.frame并将其称为MyDFMyDF$X,则会收到错误消息。相反,它应该是MyDF()MyDF()$X您需要对使用reactive()创建的任何对象使用此命名约定。

为什么会发生这种情况:

使用data.frame制作反应对象(例如reactive())时,很容易将其视为与其他任何非反应性data.frame一样,并相应地编写代码。但是,你创建的并不是data.frame.而是你所做的是指令,以函数的形式,它告诉我们如何制作data.frame什么时候需要。当你希望实际使用这个函数得到data.frame你必须使用括号时,就像你在R中的任何其他函数一样。如果你忘记使用括号,R认为你试图使用的一部分一个函数,并给你错误。尝试输入:

plot$x

在命令行中你会得到同样的错误。

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