Я разрабатываю приложение, которое требует ввода данных от пользователя. Мне нужно, чтобы приложение сбрасывало все, как только пользователь нажимал кнопку «Обзор», чтобы загрузить новые данные (я думаю, что это плохая практика — просить пользователя сбросить все с помощью отдельной кнопки, а затем просматривать новые данные!). Я надеялся, что этот код сработает, но это не так! Кнопка "Обзор" ничего не удаляет!
library(shiny)
x = 0.1
y = 0.1
df = data.frame(x,y) #Just define a simple dataset
ui <- shinyUI(fluidPage(
fileInput('datafile', 'Select your data CSV file',
accept=c('csv', 'comma-separated-values','.csv')),
tableOutput('table'),
))
server <- shinyServer(function(input, output, session) {
output$table = renderTable({
df
})
#
observeEvent(input$datafile, {
output$table = NULL #This one didn't work
df = NULL #This one didn't work as well
})
})
shiny::shinyApp(ui, server)
Это просто минимальный пример кода. Может ли кто-нибудь помочь мне удалить ранее введенные переменные с помощью кнопки «Обзор», чтобы приложение было свежим для поступления новых данных?
df
должен быть реактивным, чтобы он изменялся в соответствии с вводом пользовательского интерфейса.
Вы можете использовать обновление reactiveVal
после просмотра нового файла:
library(shiny)
x = 0.1
y = 0.1
ui <- shinyUI(fluidPage(
fileInput('datafile', 'Select your data CSV file',
accept=c('csv', 'comma-separated-values','.csv')),
tableOutput('table'),
))
server <- shinyServer(function(input, output, session) {
df <- reactiveVal(data.frame(x,y))
observe({
file <- input$datafile
ext <- tools::file_ext(file$datapath)
req(file)
validate(need(ext == "csv", "Please upload a csv file"))
df(read.csv(file$datapath, header = T))
})
output$table = renderTable({
df()
})
})
Если значения являются реактивными, вы можете сбросить их в коде, который я предоставил. Например, вместо df(read.csv(file$datapath, header = T))
вы можете использовать df(NULL)
, чтобы очистить df
. Вы можете сделать это с любой реактивной переменной, которую хотите сбросить.
Проблема решается с помощью reactiveVal(). Вот что я очень хотел увидеть:
library(shiny)
ui <- shinyUI(fluidPage(
fileInput('datafile', 'Select your data CSV file',
accept=c('csv', 'comma-separated-values','.csv')),
textInput("txt", "Enter the text to display below:"),
verbatimTextOutput("default"),
tableOutput('table'), #This is just to check whether the variable will be deleted
))
server <- shinyServer(function(input, output, session) {
X <- reactiveVal(c(1,3))
Y <- reactiveVal(NULL)
observe({
Y(input$txt)
})
output$default <- renderText({Y() })
output$table = renderTable({ #This is just to check whether the variable will be deleted
X()
})
observeEvent(input$datafile,{
Y(NULL)
X(NULL)
})
})
shiny::shinyApp(ui, server)
Кнопка «Обзор» используется в качестве кнопки действия для сброса всего, что определено до нажатия кнопки.
Хорошо, может быть, я не мог правильно выразить то, что я имел в виду. Написанный вами код перезаписывает предыдущий фрейм данных, но я хотел использовать кнопку «Обзор» в качестве инструмента для удаления всего остального в приложении. В основном все, что определено ранее, должно быть удалено, просто просматривая новые данные (здесь мне даже не нужно видеть новые данные, я просто хочу, чтобы они удалили все остальное, как в моем реальном приложении, я хочу, чтобы просмотр полностью обновил приложение) .