在这个闪亮的应用中,用户可以选择一个数据集,这个数据集被显示出来,用户可以对列的顺序进行排序(感谢shinyjqui):
library(shiny)
library(shinyjqui)
library(googleVis)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("dataset", "Select a dataset",
choices = c("iris", "mtcars")),
uiOutput("sortable")
),
#
mainPanel(
htmlOutput("gvtable")
)
)
))
server <- shinyServer(function(input, output) {
Dat <- reactive({
switch(input$dataset,
iris = iris,
mtcars = mtcars)
})
output$sortable <- renderUI({
jqui_sortabled(
do.call(function(...) tags$ul(id="list", ...),
lapply(colnames(Dat()), function(col) tags$li(col)))
)
})
output$gvtable <- renderGvis({
validate(need(input$list_order, message=FALSE))
if(all(input$list_order[["html"]] %in% names(Dat()))){
colOrder <- input$list_order[["html"]]
}else{
colOrder <- names(Dat())
}
gvisTable(Dat()[, colOrder],
options = list(
gvis.editor="Edit me!",
page="enable")
)
})
})
runApp(list(ui=ui, server=server))当我运行应用程序时,这很好用:显示iris数据集,我可以处理列的顺序(侧边栏中的列列表是可排序的):

但是当我选择另一个数据集时,列的列表是不可排序的。为什么以及如何解决这个问题?
发布于 2017-08-18 22:53:09
这是通过对可排序列表使用不同的id来实现的:
randomID <- eventReactive(Dat(), {
paste0("list", rpois(1, 1000))
})
output$sortable <- renderUI({
jqui_sortabled(
do.call(function(...) tags$ul(id=randomID(), ...),
lapply(colnames(Dat()), function(col) tags$li(col)))
)
})
output$gvtable <- renderGvis({
validate(need(input[[paste0(randomID(), "_order")]], message=FALSE))
columns <- input[[paste0(randomID(), "_order")]][["html"]]
if(all(columns %in% names(Dat()))){
colOrder <- columns
}else{
colOrder <- names(Dat())
}
gvisTable(Dat()[, colOrder],
options = list(
gvis.editor="Edit me!",
page="enable")
)
})发布于 2017-08-25 11:18:00
这是由于Github上的开发版本中修复了shinyjqui v0.2.0的一个错误。你可以在新版本提交给CRAN之前尝试一下。
https://stackoverflow.com/questions/45759414
复制相似问题