【问题标题】:R Shiny renderDataTable issueR闪亮的renderDataTable问题
【发布时间】:2018-07-30 06:21:57
【问题描述】:

当我在 R 中尝试以下代码时,数据表完美呈现按钮列中不同数量的“x”按钮。

data <- iris[1:20,1:2]
data$Button <- lapply(paste0("x",1:20),function(x) paste(rep(as.character(actionButton(x,label="x")),sample(1:3,1)),collapse="  ",sep="  "))
datatable(data)

但是当我尝试在闪亮的应用程序中包装数据框时,一页上的每一行中总是有相同数量的“x”按钮。可重现的代码:

library(shiny)
library(DT)
server <- function(input, output) {
output$mytab <- renderDataTable({
data <- iris[1:20,1:2]
data$Button <- lapply(paste0("x",1:20),function(x) paste(rep(as.character(actionButton(x,label="x")),sample(1:3,1)),collapse="  ",sep="  "))
datatable(data)
})
}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
),
mainPanel(dataTableOutput("mytab"))
)
)
shinyApp(ui = ui, server = server)

然后弹出如下错误。

Warning in `[<-.data.frame`(`*tmp*`, , j, value = list("<button id=\"x1\" type=\"button\" class=\"btn btn-default action-button\">x</button>",  :
provided 10 variables to replace 1 variables

有什么建议可以解决这个问题吗?

System Information
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.3
[1] DT_0.2.12   shiny_1.0.5

【问题讨论】:

    标签: r shiny data.table


    【解决方案1】:

    主要问题是您的按钮 ID:

    library("shiny")
    library("DT")
    set.seed(1)
    
    data <- iris[1:20, 1:2]
    data$Button <- sapply(paste0("x", 1:20), function(x) {
      n_seq <- seq(sample(1:3, 1L))
      btns  <- sapply(n_seq, function(n) {
        id <- sprintf("%s_%s", x, n)
        as.character(actionButton(id, label = "x"))
      })
      return(paste0(btns, collapse = "  "))
    })
    
    server <- function(input, output) {
      output$mytab <- renderDataTable({
        datatable(data, escape = FALSE)
      })
    }
    ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(
        ),
        mainPanel(dataTableOutput("mytab"))
      )
    )
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 我在尝试运行您的代码时遇到了完全相同的错误和问题。这些是我的包版本 DT_0.2.12 shiny_1.0.5
    【解决方案2】:

    从@mlegge 的回答中获取建议后,将固定代码恢复为原始代码格式

    1) 将第 6 行中的 lapply 调用替换为 sapply 调用

    2) 在第 7 行的数据表调用中添加了 escape=FALSE 参数

    library(shiny)
    library(DT)
    server <- function(input, output) {
    output$mytab <- renderDataTable({
    data <- iris[1:20,1:2]
    data$Button <- sapply(paste0("x",1:20),function(x) paste(rep(as.character(actionButton(x,label="x")),sample(1:3,1)),collapse="  ",sep="  "))
    datatable(data,escape=FALSE)
    })
    }
    ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
    ),
    mainPanel(dataTableOutput("mytab"))
    )
    )
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 2014-07-06
      • 2016-01-02
      • 1970-01-01
      • 2020-12-26
      • 2018-05-02
      • 2020-09-18
      • 2014-09-29
      • 2021-11-21
      相关资源
      最近更新 更多