ОБНОВЛЕНИЕ (немного ближе, но пока нет):
Я знаю, что модули могут возвращать данные (как reactiveValues
). Поэтому моя задача сейчас - вернуть данные в вашем x()
. С некоторыми случайными нереактивными значениями это работает в том смысле, что я могу собрать (добавить) выходные данные вызова модуля в переменную и затем показать эти значения в виде строки, например. Вот где я:
library(shiny)
library(shinyWidgets)
library(dplyr)
addTab <- function(id) {
ns <- NS(id)
tagList(
selectInput(ns("select"),
"Choose",
choices = colnames(mtcars)),
tableOutput(ns("table"))
)
}
moduleTable <- function(input, output, session){
x <- reactive(select(mtcars, input$select))
output$table <- renderTable({
x()
})
table_list <- reactiveValues()
table_list$test <- sample(letters, 1)
table_list$first_value <- x()[1,1]
return(table_list)
}
ui <- navbarPage(position = "static-top",
title = "foo",
id = "tabs",
tabPanel(title = "Merge",
fluidRow(
checkboxGroupInput("to_merge",
label = "Tables to merge",
choices = NULL),
textOutput("string"),
textOutput("first_value")
)),
tabPanel(title = "More",
icon = icon("plus"),
fluidRow()
)
)
server <- function(input, output, session) {
vals <- reactiveValues(val = 0, name = "", string_output = NULL, first_value = NULL)
observeEvent(input$tabs, {
if (input$tabs == "More"){
vals$val <- vals$val+1
name <- paste0("Name ", vals$val)
insertTab(inputId = "tabs",
tabPanel(title = name,
addTab(paste0("select", vals$val))
),
target = "More",
position = "before",
select = TRUE)
m_output <- callModule(moduleTable, paste0("select", vals$val))
vals$string_output <- c(vals$string_output, m_output$test)
vals$first_value <- c(vals$first_value, m_output$first_value)
vals$name[vals$val] <- paste0("mtcars$select", vals$val, "_", m_output$test)
updateCheckboxGroupInput(session = session,
inputId = "to_merge",
choices = vals$name)
output$string <- renderText({
req(input$tabs)
paste(vals$string_output, collapse = ", ")
})
output$first_value <- renderText({
req(input$tabs)
paste(vals$first_value, collapse = ", ") # This doesn't work as expected
})
}
})
}
shinyApp(ui = ui, server = server)
Как насчет этого?
library(shiny)
library(shinyWidgets)
library(dplyr)
addTab <- function(id) {
ns <- NS(id)
tagList(
selectInput(ns("select"),
"Choose",
choices = colnames(mtcars)),
tableOutput(ns("table"))
)
}
moduleTable <- function(input, output, session){
x <- reactive(select(mtcars, input$select))
output$table <- renderTable({
x()
})
}
ui <- navbarPage(position = "static-top",
title = "foo",
id = "tabs",
tabPanel(title = "Merge",
fluidRow(
checkboxGroupInput("to_merge",
label = "Tables to merge",
choices = NULL)
)),
tabPanel(title = "More",
icon = icon("plus"),
fluidRow()
)
)
server <- function(input, output, session) {
vals <- reactiveValues(val=0, name = "")
dfs <- list()
observeEvent(input$tabs, {
if (input$tabs == "More"){
vals$val <- vals$val+1
name <- paste0("Name ", vals$val)
insertTab(inputId = "tabs",
tabPanel(title = name,
addTab(paste0("select", vals$val))
),
target = "More",
position = "before",
select = TRUE)
callModule(moduleTable, paste0("select", vals$val))
vals$name[vals$val] <- paste0("mtcars$select", vals$val)
print(vals$name)
updateCheckboxGroupInput(session = session,
inputId = "to_merge",
choices = vals$name)
}
})
}
shinyApp(ui = ui, server = server)