动态替换 R Shiny 数据表中的选项

Posted

技术标签:

【中文标题】动态替换 R Shiny 数据表中的选项【英文标题】:Replace options in R Shiny datatable on the fly 【发布时间】:2020-04-30 02:23:12 【问题描述】:

我想即时更改数据表的语言

我有以下代码

output$prr2 <- renderDataTable(  
prr(), options = list(
autoWidth = TRUE,
columnDefs = list(list(width = '50', targets = c(1, 2) ) ),
language = list(url = if(getLanguage()=='gr') '//cdn.datatables.net/plug-ins/1.10.11/i18n/Greek.json' else  
  '//cdn.datatables.net/plug-ins/1.10.11/i18n/English.json' ))

getLanguage() 返回 selected_language 的值,prr() 返回一个data.frame。

我想做这样的事情,以便在下拉 selected_language 中选择不同的语言后更改表格的选项

proxy = dataTableProxy('prr2')
observeEvent(input$selected_language, replace language option of datatable prr2)

对此有什么想法吗?

【问题讨论】:

你的意思是language = list(url = if(getLanguage()=='gr') ...... 不起作用? 第一次调用 renderDataTable 时确实有效。但我想根据选择刷新它。每次语言选择改变时,我都希望数据表改变它的语言 【参考方案1】:

我无法测试,因为您没有提供可重现的示例。我会试试的

output$prr2 <- renderDataTable(  
  prr()
, options = exprToFunction(list(
  autoWidth = TRUE,
  columnDefs = list(list(width = '50', targets = c(1, 2))),
  language = list(
    url = ifelse(getLanguage()=='gr', 
                 '//cdn.datatables.net/plug-ins/1.10.11/i18n/Greek.json', 
                 '//cdn.datatables.net/plug-ins/1.10.11/i18n/English.json')
  )
)))

编辑

output$prr2 <- renderDataTable(  
  datatable(
    prr(),
    options = exprToFunction(list(
      autoWidth = TRUE,
      columnDefs = list(list(width = '50', targets = c(1, 2))),
      language = list(
        url = ifelse(getLanguage()=='gr', 
                     '//cdn.datatables.net/plug-ins/1.10.11/i18n/Greek.json', 
                     '//cdn.datatables.net/plug-ins/1.10.11/i18n/English.json')
      )
    )
    )
  )
)

编辑 2

完整的应用程序:

library(shiny)
library(DT)

ui <- fluidPage(
  radioButtons("language", "Language", choices = c("gr", "en")),
  DTOutput("prr2")
)

server <- function(input, output, session)
  output$prr2 <- renderDT(  
    datatable(
      iris,
      options = exprToFunction(list(
        autoWidth = TRUE,
        columnDefs = list(list(width = '50', targets = c(1, 2))),
        language = list(
          url = ifelse(input$language=='gr', 
                       '//cdn.datatables.net/plug-ins/1.10.11/i18n/Greek.json', 
                       '//cdn.datatables.net/plug-ins/1.10.11/i18n/English.json')
        )
      ))
    )
  )


shinyApp(ui, server)

【讨论】:

如果唯一的变化是exprToFunction,看来这个解决方案对我不起作用。当我用 id selected_language 更改 doropdown 的值时,数据表的翻译没有任何反应,我应该添加 getLanguage() 返回 selected_language 的值 我已经复制粘贴了您的代码,它不会产生错误但不起作用。 prr() 返回一个data.frame ***.com/questions/56879672/… github.com/rstudio/DT/issues/168 这里有一些相关的例子,但是那里的代码替换了数据而不是选项 @vagelis 对我来说有效。也许你不使用好的renderDataTable。使用renderDTDT::renderDataTable 是的,这行得通。我用 input$selected_language 更改了 getLanguage() 并且它有效(我不明白为什么)。谢谢!另外,您能否解释一下 exprToFunction 为什么起作用?

以上是关于动态替换 R Shiny 数据表中的选项的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny:如何将数据表添加到动态创建的选项卡

r 使用Shiny中的下载选项过滤数据表列

更新 R Shiny 中的 DT 列过滤器选择

R Highcharter:Shiny on the fly 中的动态钻取

在 Plotly/Shiny 中使用代理接口动态更改数据

使用两个相关的 selectInput 过滤 R Shiny 中的数据帧