所以我正在尝试创建一个闪亮的应用程序,我有一个按钮,只显示文件已上传;为此我使用conditionalPanel。
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"))
))
我认为我的服务器中没有任何需要关注的内容。因为上面的例子没有做任何事情。在上述条件下,按钮从不显示,即条件永远不会成立。
我为自己的情况尝试过的一些事情是input.files.length > 0
,input.files.size() > 0
,这两个因素都会导致按钮出现之前我上传文件。我猜这是因为在选择文件之前输入$ files是一个空的data.frame,因此长度/大小非零,是吗?
在完成上传至少一个文件之前,我可以使用什么条件隐藏按钮?
我认为另一种选择是将conditionalPanel
替换为uiOutput
,并在server.R中的observe / isolate块内调用renderUI({actionButton(...)})
,它正在监视input.files({{ 1}});这是唯一的方法吗?如果我能以这种方式做到这一点,是什么让我选择一个或另一个(超过if (nrow(input$files) < 1) return()
导致更少的代码)?
答案 0 :(得分:39)
您必须使响应输出返回上传状态,并将此输出的选项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",
......