什么是 Shiny 中的“‘闭包’类型的对象不可子集化”错误?

Posted

技术标签:

【中文标题】什么是 Shiny 中的“‘闭包’类型的对象不可子集化”错误?【英文标题】:What is “object of type ‘closure’ is not subsettable” error in Shiny? 【发布时间】:2017-03-30 03:45:28 【问题描述】:

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

注意:我写了这个问题,因为这个问题出现了很多,可能的骗子要么与shiny 无关,要么太具体以至于答案是否广泛适用并不明显。

【问题讨论】:

仍然是一个骗子,同样的错误正在发生,你不能子集一个闭包(函数),与闪亮的(function() )$x无关并且解释是不必要的,reactive返回一个函数,所以mfDF$x 试图子集一个你不能做的函数 我倾向于同意@rawr,因为该错误与闪亮无关,只是在闪亮中遇到了很多。但是,您的答案中的解释很有用。 我认为不同之处在于,许多新的闪亮用户不会将反应式data.frames 等视为函数,而是将其视为data.frames。因此,当他们看到一个讨论函数的不光彩的答案时,不清楚它是如何应用的。也就是说,我同意这是同一个问题,但我认为另一个问题也很有用。 为什么闪亮的用户不阅读手册? ?shiny::reactiveValue a function, wrapped in a S3 class "reactive" 【参考方案1】:

另请参阅 this question,它涵盖了非闪亮上下文中的此错误。

如何解决这个问题:

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

例如,假设您像这样创建了一个响应式data.frame

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

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

为什么会这样:

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

plot$x

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

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

【讨论】:

不错的答案。我也遇到了这个错误,有些是如何解决这个问题的。但对于可能遇到此问题的人来说很好。 :) 很好的解释。我想通过互联网拥抱你,因为这救了我

以上是关于什么是 Shiny 中的“‘闭包’类型的对象不可子集化”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Shiny 中的“超出最大上传大小”限制并保存用户文件输入?

为啥“<<-”会与 Shiny 中的函数范围混淆

从 Shiny 中的 sideBarMenu 和 radioButton 选择时不显示图表

Shiny:Shiny Dashboard (sidebarMenu) 中的 renderMenu 和 observeEvent 冲突

响应式更新模块化 Shiny 应用程序中的侧边栏

不锈钢表面处理2R shiny 专业英语词汇的意思