所以我正在尝试制作一个闪亮的应用程序,其中我有一个按钮,该按钮仅在文件上传时才显示; 为此,请使用条件面板。
用户界面。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"))
))
我认为我的服务器中没有什么可关心的。R,因为上面的例子没有做任何事情。在上述条件下,按钮永远不会显示,即条件永远不会为真。
我为我的病情尝试过的一些事情是input.files.length > 0
、input.files.size() > 0
,这两者都会导致在我上传文件之前按钮存在。我猜这是因为input$files在选择文件之前是一个空的data.frame,所以有一个非零的长度/大小,对吗?
在至少一个文件完成上传之前,我可以使用什么条件来隐藏按钮?
我认为另一种选择是用uiOutput
替换conditionalPanel
,并在服务器中的观察/隔离块内调用renderUI({actionButton(...)})
。R 正在监视输入文件(if (nrow(input$files) < 1) return()
);这是唯一的办法吗?如果我能以任何一种方式做到这一点,那么是什么会让我选择一个或另一个(除了conditionalPanel
导致更少的代码)?
您必须制作一个返回上传状态的反应式输出,并将此输出的选项suspendWhenHidden
设置为 FALSE
。
更准确地说,在服务器中。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",
......
在 R 4.2.2 下,我必须将其更改为 "output.fileUploaded == 0"
才能使其工作。我不知道为什么。