Отредактированный DataTable не обновляется в Shiny Module - PullRequest
0 голосов
/ 24 мая 2018

Я хотел бы встроить numericInput и checkBoxInput в таблицу данных.У меня есть пример из Xie Yihui, который прекрасно работает.Точно так же, как я хотел.Но когда код помещается в модуль, отредактированная таблица не обновляется.Я читал, что это может быть связано с пространством имен, но я не знаю, как это исправить.

Вот суть:

Суть: редактировать таблицу данных в блестящем приложении

Суть: редактировать таблицу данных в блестящем модуле

Заранее спасибо:)

1 Ответ

0 голосов
/ 24 мая 2018

Было только одно маленькое исправление, которое, конечно, трудно увидеть, если вы не знакомы с модулями Shiny.Каждый идентификатор входа , который вы создаете в функции сервера модуля, должен быть заключен в ns (как вы делаете в пользовательском интерфейсе), но эта функция скрыта в session$ns в функции сервера.Таким образом, в строке 18, где создаются входные данные, их ID должен быть скорректирован с помощью session$ns.От

inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))

до

inputs[i] = as.character(FUN(paste0(session$ns(id), i), label = NULL, ...))

Полный код:

library(shiny)
library(DT)


editTableUI <- function(id) {
  ns <- NS(id)
  tagList(
    DT::dataTableOutput(ns('x1')),
    verbatimTextOutput(ns('x2'))
  )
}

editTable <- function(input, output, session) {
  # create a character vector of shiny inputs
  shinyInput = function(FUN, len, id, ...) {
    inputs = character(len)
    for (i in seq_len(len)) {
      inputs[i] = as.character(FUN(paste0(session$ns(id), i), label = NULL, ...))
    }
    inputs
  }



  # obtain the values of inputs
  shinyValue = function(id, len) {
    unlist(lapply(seq_len(len), function(i) {
      value = input[[paste0(id, i)]]
      if (is.null(value)) NA else value
    }))
  }

  # a sample data frame
  res = data.frame(
    v1 = shinyInput(numericInput, 100, 'v1_', value = 0),
    v2 = shinyInput(checkboxInput, 100, 'v2_', value = TRUE),
    v3 = rnorm(100),
    v4 = sample(LETTERS, 100, TRUE),
    stringsAsFactors = FALSE
  )

  # render the table containing shiny inputs
  output$x1 = DT::renderDataTable(
    res, server = FALSE, escape = FALSE, options = list(
      preDrawCallback = JS('function() {
                           Shiny.unbindAll(this.api().table().node()); }'),
      drawCallback = JS('function() {
                        Shiny.bindAll(this.api().table().node()); } ')
      )
      )
  # print the values of inputs
  output$x2 = renderPrint({
    data.frame(v1 = shinyValue('v1_', 100), v2 = shinyValue('v2_', 100))
  })
      }

shinyApp(
  ui = fluidPage(
    editTableUI("test")
  ),

  server = function(input, output) {
    callModule(editTable, "test")
  }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...