如果您在下面运行该应用程序,它在开始时工作得很好:您可以重新排序mtcars的行,顺序出现在verbatimTextOutput中。但是,一旦使用单选按钮将数据更改为iris,就不再起作用了。
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来响应单选按钮,这会稍微好一点:有时会像预期的那样工作。
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的另一种选择
发布于 2022-08-17 01:27:36
你们已经很接近了,但还需要做更多的工作。这将起作用:
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)让我解释一下原因。
在
$.map(idx ...中,我想监听器被添加到每个行元素中。shinyjqui.msgCallback({"ui":"[id='tbl']"。这是与旧表相同的ID。两个表的行都指向相同的ID,因此ID冲突通常会引起麻烦。这就是我的猜测,为什么它给你NULL.destroy选项将不起作用,因为可排序应用于每一行,因此您需要应用nrow销毁时间,它无法避免ID冲突问题。

我认为这是一个关键的特点,这个包是缺失的。我建议你在吉特布上提个问题。
https://stackoverflow.com/questions/73381062
复制相似问题