R Shiny,调用模块中的 DT::replaceData 不起作用

Posted

技术标签:

【中文标题】R Shiny,调用模块中的 DT::replaceData 不起作用【英文标题】:R Shiny, DT::replaceData in callModule not working 【发布时间】:2018-08-09 20:33:20 【问题描述】:

在 R Shiny 应用程序中,我尝试使用 DT::replaceData 更新数据以显示保留当前状态(例如过滤)。 虽然它适用于一个简单的闪亮应用程序,但当我将应用程序模块化并从 callModule 调用时,它就不行了。

在下面的示例中,在顶部框中选择物种应该会触发数据替换以显示在下面。

这是一个工作示例:

library(shiny)

ui <- fluidPage(
  selectInput('species', 'Choose Species',
              choices=unique(iris$Species),
              selected=unique(iris$Species), multiple=TRUE),
  DT::dataTableOutput('dt')
)

server <- function(input, output, session) 
  output$dt <- DT::renderDataTable(
    DT::datatable(
      iris, filter='top',
      options = list(autoWidth=TRUE)
    )
  )

  observeEvent(is.null(input$species), 
    DT::replaceData(
      DT::dataTableProxy('dt'),
      dplyr::filter(iris, Species %in% input$species)
    )
  )


shinyApp(ui, server)

这是不工作的模块化版本:

library(shiny)

ui <- function(id) 
  ns <- NS(id)
  tagList(
    selectInput(ns('species'), 'Choose Species',
                choices=unique(iris$Species),
                selected=unique(iris$Species), multiple=TRUE),
    DT::dataTableOutput(ns('dt'))
  )


server <- function(input, output, session) 
  output$dt <- DT::renderDataTable(
    DT::datatable(
      iris, filter='top',
      options = list(autoWidth=TRUE)
    )
  )

  observeEvent(is.null(input$species), 
    print(input$species)
    DT::replaceData(
      DT::dataTableProxy('dt'),
      dplyr::filter(iris, Species %in% input$species)
    )
  )



mainUi <- fluidPage(ui('app'))
mainSrv <- function(input, output, session) 
  callModule(server, 'app')

shinyApp(mainUi, mainSrv)

我想知道为什么第二个例子不起作用,如果可能的话如何解决它。


更新

解决了!

自 DT v0.3 起已修复。 见:https://github.com/rstudio/DT/issues/357

【问题讨论】:

我认为问题在于,在创建代理时,您使用“dt”,而真正的输出标识符是命名空间 + id(在您的情况下为“app-dt”)。至少这是浏览器中的 javascript 控制台显示的内容。不幸的是,这只是回答了“为什么”部分,因为简单地将其设置为“app-dt”除了摆脱浏览器警告之外没有任何效果...... @Mikolaj 原来,我使用的是旧版本的包。查看更新。谢谢。 很高兴听到!我也在使用 0.2... :) 【参考方案1】:

自 v3.0 起已解决。 参考:https://github.com/rstudio/DT/issues/357

所以,简单解决:

install.packages('DT')
packageVersion('DT')
# [1] ‘0.4’

【讨论】:

以上是关于R Shiny,调用模块中的 DT::replaceData 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

r Shiny中的简单模块

将函数连接到 R Shiny Dashboard 中的 actionButton

r 将模块中返回的值存储在Shiny中的reactiveValues中

R Shiny:如何从数据表中的自定义按钮调用 JavaScript 函数

r 在Shiny模块中返回reactiveValues

R Shiny 启用/禁用 UI 模块