publicar - Haga que conditionalPanel dependa de los archivos cargados con fileInput
shiny r tutorial (1)
Así que estoy intentando crear una aplicación brillante donde tengo un botón que solo aparece si se han cargado archivos; para esto estoy usando el panel condicional.
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"))
))
No creo que haya nada de qué preocuparse en mi servidor. R, ya que el ejemplo anterior no hace nada. Con la condición anterior, el botón nunca aparece, es decir, la condición nunca es verdadera.
Algunas cosas que he probado para mi condición son input.files.length > 0
, input.files.size() > 0
, lo que hace que el botón esté presente antes de cargar un archivo. Supongo que esto se debe a que la entrada $ files es un data.frame vacío antes de elegir los archivos, por lo que tiene una longitud / tamaño diferente a cero, ¿es eso correcto?
¿Qué condición puedo usar para ocultar el botón hasta que al menos un archivo haya terminado de cargarse?
Creo que otra opción sería reemplazar el uiOutput
conditionalPanel
con uiOutput
y llamar a renderUI({actionButton(...)})
dentro de un bloque de observación / aislamiento en el servidor.R que está viendo input.files ( if (nrow(input$files) < 1) return()
); ¿Es esa la única manera? Si puedo hacer esto de cualquier manera, ¿qué me haría elegir uno o el otro (más allá del panel conditionalPanel
da como resultado menos código)?
suspendWhenHidden
realizar una salida reactiva que devuelva el estado de la carga y establecer la opción suspendWhenHidden
de esta salida en FALSE
.
Más precisamente, en server.R seguramente tiene una función reactiva, digamos getData()
para crear un marco de datos a partir del archivo cargado. Entonces haz esto:
getData <- reactive({
if(is.null(input$files)) return(NULL)
......
})
output$fileUploaded <- reactive({
return(!is.null(getData()))
})
outputOptions(output, ''fileUploaded'', suspendWhenHidden=FALSE)
Y en ui.R puedes usar conditionalPanel()
haciendo:
conditionalPanel("output.fileUploaded",
......