使 conditionalPanel 依赖于使用 fileInput 上传的文件
Posted
技术标签:
【中文标题】使 conditionalPanel 依赖于使用 fileInput 上传的文件【英文标题】:Make conditionalPanel depend on files uploaded with fileInput 【发布时间】:2013-11-10 06:46:11 【问题描述】:所以我正在尝试制作一个闪亮的应用程序,其中有一个按钮,该按钮仅在文件已上传时才会显示;为此我使用了条件面板。
ui.R:
require(shiny)
shinyUI(pageWithSidebar(
headerPanel("My App"),
sidebarPanel(
fileInput("files", "Choose file"),
conditionalPanel(
condition = "input.files",
actionButton("submitFiles", "Submit files for processing"))),
mainPanel(h3("Nothing to see here"))
))
我认为在我的 server.R 中没有什么需要关心的,因为上面的示例没有做任何事情。在上述条件下,按钮永远不会出现,即条件永远不会为真。
我为自己的情况尝试过的一些方法是input.files.length > 0
、input.files.size() > 0
,这两种方法都会导致按钮出现在我上传文件之前。我猜这是因为 input$files 在选择文件之前是一个空的 data.frame,因此长度/大小不为零,对吗?
在至少一个文件上传完成之前,我可以使用什么条件隐藏按钮?
我认为另一种选择是将conditionalPanel
替换为uiOutput
,并在server.R 的观察/隔离块内调用renderUI(actionButton(...))
,该块正在监视input.files (if (nrow(input$files) < 1) return()
);这是唯一的方法吗?如果我能以任何一种方式做到这一点,是什么让我选择其中一个(除了conditionalPanel
导致更少的代码)?
【问题讨论】:
【参考方案1】:您必须创建一个响应式输出来返回上传状态,并将此输出的选项suspendWhenHidden
设置为FALSE
。
更准确地说,在 server.R 中你肯定有一个反应函数,比如getData()
来从上传的文件中创建一个数据框。然后这样做:
getData <- reactive(
if(is.null(input$files)) return(NULL)
......
)
output$fileUploaded <- reactive(
return(!is.null(getData()))
)
outputOptions(output, 'fileUploaded', suspendWhenHidden=FALSE)
而在 ui.R 中,您可以通过以下方式使用 conditionalPanel()
:
conditionalPanel("output.fileUploaded",
......
【讨论】:
啊哈,我什至不知道outputOptions()
的存在!这是一种在output
列表中“隐藏”某些内容的棘手方法,但它确实有效。
似乎有些事情发生了变化,现在必须做"output.fileUploaded == true"
。
由于R中通常使用全大写TRUE
,所以我觉得我应该指出"output.fileUploaded == true"
中使用的小写true
是正确的。以上是关于使 conditionalPanel 依赖于使用 fileInput 上传的文件的主要内容,如果未能解决你的问题,请参考以下文章
Shiny pickerInput - conditionalPanel 仅将值设置为第一个选择
Shiny:基于 selectizeInput 的 conditionalPanel 问题
如何在 Shiny 的 ConditionalPanel 中将列表添加到隐藏的选项中?