#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