Блестящая мета: как использовать expandChain в модулях? - PullRequest
0 голосов
/ 17 февраля 2020

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

Однако, expandChain не обнаружит реактивный материал, который я вызываю, потому что имя этого материала меняется, так как он создан в модуле. Взгляните на приложение ниже:

library(dplyr)
library(shiny)
library(shinymeta)
library(WDI)

module_ui <- function(id){
  ns <- NS(id)

  tagList(
    fluidRow(
      actionButton(ns("show_table"), "Show table"),
      actionButton(ns("show_code"), "Show code"),
      tableOutput(ns("table"))
    )
  )
}

module_server <- function(input, output, session){
  data <- metaReactive2({
    req(input$show_table)

    isolate(metaExpr({
      mtcars 
    }))
  })

  output$table <- renderTable({
    data()
  })

  observeEvent(input$show_code, {
    showModal(modalDialog(
      renderPrint({
        expandChain(data())
      })
    ))
  })
}

ui <- fluidPage(
  actionButton("launch", "Launch")
)

server <- function(input, output, session) {

  count <- reactiveValues(value = 0)

  observeEvent(input$launch, {
    count$value <- count$value + 1
    insertUI(selector = "#launch",
             where = "afterEnd",
             ui = module_ui(count$value))
    callModule(module_server, count$value)
  })

}

shinyApp(ui, server)

Когда я пытаюсь показать код для сгенерированной таблицы, у меня появляется ошибка:

Warning: Error in : <text>:2:2: unexpected input
1: `1_data` <- mtcars
2: 1_
    ^
  133: <Anonymous>

Поскольку модуль переименовывает data() добавив число, data() не распознается expandChain. Я попытался с:

expandChain(paste0(id, "_data()"))

без успеха (так как expandChain не поддерживает символ).

Кто-нибудь знает, как это сделать?

Также спросили на RStudio Community

1 Ответ

0 голосов
/ 20 февраля 2020

Вот решение, данное на RStudio Community (некоторые дополнительные сведения см. По ссылке):

library(dplyr)
library(shiny)
library(shinymeta)
library(WDI)

module_ui <- function(id){
  ns <- NS(id)

  tagList(
    fluidRow(
      actionButton(ns("show_table"), "Show table"),
      actionButton(ns("show_code"), "Show code"),
      tableOutput(ns("table"))
    )
  )
}

module_server <- function(input, output, session){
  data <- metaReactive2({
    req(input$show_table)

    isolate(metaExpr({
      mtcars 
    }))
  })

  output$table <- renderTable({
    data()
  })

  observeEvent(input$show_code, {
    showModal(modalDialog(
      renderPrint({
        expandChain(data())
      })
    ))
  })
}

ui <- fluidPage(
  actionButton("launch", "Launch")
)

server <- function(input, output, session) {

  count <- reactiveValues(value = 0)

  observeEvent(input$launch, {
    count$value <- count$value + 1
    insertUI(selector = "#launch",
             where = "afterEnd",
             ui = module_ui(paste0("x", count$value)))
    callModule(module_server, paste0("x", count$value))
  })

}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...