首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有反应性数据的shinyjqui::sortableTableOutput

使用带有反应性数据的shinyjqui::sortableTableOutput
EN

Stack Overflow用户
提问于 2022-08-16 22:36:54
回答 1查看 32关注 0票数 2

如果您在下面运行该应用程序,它在开始时工作得很好:您可以重新排序mtcars的行,顺序出现在verbatimTextOutput中。但是,一旦使用单选按钮将数据更改为iris,就不再起作用了。

代码语言:javascript
复制
library(shiny)
library(shinyjqui)

ui <- fluidPage(
  radioButtons("radio", "Data", choices = c("mtcars", "iris")),
  verbatimTextOutput("rows"),
  sortableTableOutput("tbl")
)

server <- function(input, output) {

  Dat <- reactive({
    if(input[["radio"]] == "mtcars") {
      mtcars
    } else {
      iris
    }
  })

  output[["rows"]] <- renderPrint({ input[["tbl_order"]] })

  output[["tbl"]] <- renderTable(Dat(), rownames = TRUE)
}

shinyApp(ui, server)

在下面的应用程序中,使用renderUI来响应单选按钮,这会稍微好一点:有时会像预期的那样工作。

代码语言:javascript
复制
library(shiny)
library(shinyjqui)

ui <- fluidPage(
  radioButtons("radio", "Data", choices = c("mtcars", "iris")),
  verbatimTextOutput("rows"),
  uiOutput("tblUI")
)

server <- function(input, output) {

  Dat <- reactive({
    if(input[["radio"]] == "mtcars"){
      mtcars
    }else{
      iris
    }
  })

  output[["rows"]] <- renderPrint({input[["tbl_order"]]})

  output[["tbl"]] <- renderTable(Dat(), rownames = TRUE)

  output[["tblUI"]] <- renderUI({
    Dat()
    sortableTableOutput("tbl")
  })

}

shinyApp(ui, server)

我们怎样才能得到一个正确工作的应用程序呢?也许是shinyjqui::sortableTabbleOutput的另一种选择

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 01:27:36

你们已经很接近了,但还需要做更多的工作。这将起作用:

代码语言:javascript
复制
library(shiny)
library(shinyjqui)

ui <- fluidPage(
    radioButtons("radio", "Data", choices = c("mtcars", "iris")),
    verbatimTextOutput("rows"),
    uiOutput("tblUI")
)

server <- function(input, output) {
    
    Dat <- reactive({
        if(input[["radio"]] == "mtcars"){
            tbl_id(0)
            mtcars
        }else{
            tbl_id(1)
            iris
        }
    })
    tbl_id <- reactiveVal(0)
    output[["rows"]] <- renderPrint({input[[paste0("tbl", tbl_id(), "_order")]]})
    
    observe({
        output[[paste0("tbl", tbl_id())]] <- renderTable(Dat(), rownames = TRUE)
    })

    output[["tblUI"]] <- renderUI({
        Dat()
        sortableTableOutput(paste0("tbl", tbl_id()))
    })
}

shinyApp(ui, server)

让我解释一下原因。

  1. 函数中,您可以看到将运行一些JS代码。脚本将表绑定到可排序事件,并绑定到闪亮事件。不完全确定jqui是如何设置闪亮的输入的,但是从这个$.map(idx ...中,我想监听器被添加到每个行元素中。
  2. ,接下来是第二个问题。如果使用可排序事件设置新的表行,则它有一个目标shinyjqui.msgCallback({"ui":"[id='tbl']"。这是与旧表相同的ID。两个表的行都指向相同的ID,因此ID冲突通常会引起麻烦。这就是我的猜测,为什么它给你NULL.
  3. Once我们知道的原因,解决方案是非常简单的。我们将两个表绑定到不同的it,在生成容器时,只需将它们命名不同,就可以了!作为像您这样有经验的闪亮用户,我相信没有必要解释代码细节。您建议的
  4. destroy选项将不起作用,因为可排序应用于每一行,因此您需要应用nrow销毁时间,它无法避免ID冲突问题。

我认为这是一个关键的特点,这个包是缺失的。我建议你在吉特布上提个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73381062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档