У меня есть блестящее приложение ниже, в котором у меня есть 2 ввода файла и 2 кнопки действия.
1-я кнопка отправки «submit» используется для запуска таблицы, а 2-я «reset» для сброса каждого ввода файла .
Когда 1-я кнопка действия пуста, я получаю предупреждение.
Какая таблица будет отображаться, зависит от условий if внутри log()
. Проблема заключается в том, что при нажатии reset
входные данные файла становятся пустыми, а таблица остается.
В идеале каждая таблица должна отображаться после нажатия кнопки submit
и при нажатии reset
при вводе файла. становятся пустыми, таблица исчезает и снова отображается предупреждение. Я думаю, что мне нужно что-то вроде комбинации из двух кнопок действия (input$submit,input$reset
) внутри log()
.
library(shiny)
library(shinyjs)
library(tidyverse)
library(DT)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
useShinyjs(),
fileInput('inFile', 'Choose 1st file'),
fileInput('inFile2', 'Choose 2nd file'),
actionButton('submit', 'Submit'),
tags$hr(),
actionButton('reset', 'Reset')
),
mainPanel(
uiOutput("choose"),
DTOutput( "choose2" )
)
)
)
server <- function(input, output, session) {
rv <- reactiveValues(
data = NULL,
clear = FALSE
)
rv2 <- reactiveValues(
data = NULL,
clear = FALSE
)
########1st
observe({
req(input$inFile)
req(!rv$clear)
rv$data <- read.csv(input$inFile$datapath,header = T)
})
observeEvent(input$inFile, {
rv$clear <- FALSE
}, priority = 1000)
observeEvent(input$reset, {
rv$data <- NULL
rv$clear <- TRUE
reset('inFile')
}, priority = 1000)
#############2nd
observe({
req(input$inFile2)
req(!rv2$clear)
rv2$data <- read.csv(input$inFile2$datapath,header = T)
})
observeEvent(input$inFile2, {
rv2$clear <- FALSE
}, priority = 1000)
observeEvent(input$reset, {
rv2$data <- NULL
rv2$clear <- TRUE
reset('inFile2')
}, priority = 1000)
output$choose <- renderUI ({
if(is.null(rv$data))
{
"You must upload 1st csv at least"
}
else
{
return(NULL)
}
})
log<-eventReactive({input$submit }, {
if(is.null(rv$data)){
return(NULL)
}
if(!is.null(isolate(rv$data))){
if(!is.null(isolate(rv2$data))){
datatable(input$inFile2$datapath)
}
else if(is.null(isolate(rv2$data))){
datatable(input$inFile$datapath)
}
}
})
output$choose2<-renderDataTable({
log()
})
}
shinyApp(ui, server)