R Блестящая функция запуска при загрузке файла

#r #shiny

#r #блестящий

Вопрос:

У меня есть блестящее приложение, которое берет текстовый файл из FileInput, обрабатывает его и устанавливает несколько переменных / фреймов данных, которые затем отображаются в InfoBoxOutputs .

Я знаю, что в настоящее время я могу обработать файл в выводе серверной функции для элементов, например, Datable, как в моем коде ниже, но, похоже, это не обновляет InfoBoxOutputs, даже если используемые переменные установлены во время функции Seed() (они определенно установлены), которая выполняется для вывода данных.

Итак, есть ли способ запустить мою функцию Seed() для одновременной обработки всех данных, чтобы все мои элементы использовали обработанные данные, или мне нужно повторно запускать функцию для каждого элемента?

 #Initialize variables which will later be set in Seed() 
mostwanted_variable <- NULL
key_vaiable <- NULL

ui <- dashboardPage(skin = "blue",
             dashboardHeader( title = "Text Check"),
                  dashboardSidebar(
                      fileInput("file1", "Upload File",
                                multiple = FALSE,
                                accept = c( ".txt"))
                       ),
                      dashboardBody(
                      
                      tabItems(
                        
                        tabItem(tabName = "statistics",
                                fluidRow(
                                  infoBoxOutput("info1"),
                                  infoBoxOutput("info2")
                                ),
                                
                                # infoBoxes with fill=TRUE
                                fluidRow(
                                  DT::dataTableOutput("mytable")
                                ) 
                                
                        )
          
                      )
                    )
)

server <- function(input, output) {
  # Main List Output 
  output$mytable = DT::renderDataTable({
    file <- input$file1
    ext <- tools::file_ext(file$datapath)
    
    req(file)
    validate(need(ext == ".txt", "Please upload a text file"))
    
    ## Processes Text File and sets many variables amp; frames 
    Seed(file$datapath)
    
    ## Select maindatasource which is set in the Seed function
    maindatasource
  })
  # Info Box 1 
  # uses variable set during Seed function 
  output$info1 <- renderInfoBox({
    infoBox(
      "Key", key_variable, icon = icon("user-secret"),
      color = "aqua" , fill = TRUE
    )
  })
  # Info Box 2
  # uses variable set during Seed function 
  output$info2 <- renderInfoBox({
    infoBox(
      "Most Wanted", mostwanted_variable, icon = icon("earlybirds"),
      color = "aqua"
    )
  })
}
  

Ответ №1:

Вы могли бы установить reactiveValues Seed() функцию, которая будет использоваться для обновления info bpxes.

 library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  skin = "blue",
  dashboardHeader(title = "Text Check"),
  dashboardSidebar(fileInput(
    "file1",
    "Upload File",
    multiple = FALSE,
    accept = c(".txt")
  )),
  dashboardBody(
    fluidRow(infoBoxOutput("info1"),
             nfoBoxOutput("info2")),
    fluidRow(DT::dataTableOutput("mytable"))
  )
)

server <- function(input, output) {
  rv <- reactiveValues(
    mostwanted_variable = NULL, 
    key_variable = NULL)
  
  Seed <- function(filename) {
    rv$mostwanted_variable <- "a"
    rv$key_variable <- 123
    return(data.frame(
      main = c(1, 2),
      data = c("a", "b"),
      source = c(3, 4)
    ))
  }
  
  # Main List Output
  output$mytable = DT::renderDataTable({
    file <- input$file1
    ext <- tools::file_ext(file$datapath)
    req(file)
    validate(need(ext == "txt", "Please upload a text file"))
    
    ## Processes Text File and sets many variables amp; frames
    maindatasource <- Seed(file$datapath)
    
  })
  # Info Box 1
  # uses variable set during Seed function
  output$info1 <- renderInfoBox({
    infoBox(
      "Key",
      rv$key_variable,
      icon = icon("user-secret"),
      color = "aqua" ,
      fill = TRUE
    )
  })
  # Info Box 2
  # uses variable set during Seed function
  output$info2 <- renderInfoBox({
    infoBox(
      "Most Wanted",
      rv$mostwanted_variable,
      icon = icon("earlybirds"),
      color = "aqua"
    )
  })
}

shinyApp(ui, server)
  

Комментарии:

1. Ах да, кажется, это работает, хотя это работает только в том случае, если начальная функция объявлена в функции сервера. В настоящее время у меня есть Seed() в отдельном файле, чтобы поддерживать порядок, вы знаете, возможно ли поддерживать эту структуру или мне придется перенести ее в функцию сервера?

2. Вы можете сохранить все вычисления из Seed() в список и передать этот список в reactiveVal