无法在 shinyalert 或 modal 中添加 sortable::rank_list()

问题描述 投票:0回答:1

我正在尝试在 Shiny 应用程序中从可排序库中添加一个 rank_list。如果输入位于 UI 的流动页面部分,这似乎工作正常。当我将它添加到 shinyalert() 或模式时,输入显示在弹出窗口中,但选择不可排序甚至不可选择。

在下面的 repex 中,我添加了一个 selectInput 以查看它是否正确地以交互方式呈现 - 它确实如此。

library(shiny)
library(sortable)
library(shinyalert)

labels <- list(
  "one",
  "two",
  "three",
  htmltools::tags$div(htmltools::em("Complex"), " html tag without a name"),
  "five" = htmltools::tags$div(htmltools::em("Complex"), " html tag with name: 'five'")
)
rank_list_multi <- rank_list(
  text = "You can select multiple items, then drag as a group",
  labels = labels,
  input_id = "rank_list_multi",
  options = sortable_options(multiDrag = TRUE)
)



ui <- fluidPage(rank_list_multi,
                actionButton("showAlert", "Show in popup"))


server <- function(input, output, session) {
  observeEvent(input$showAlert, {
    print("Show popup")
    
    shinyalert(
      title = "Reorder this object",
      html = TRUE,
      closeOnClickOutside = TRUE,
      showConfirmButton = TRUE,
      text = tagList(
        rank_list_multi,
        br(),
        selectInput("alertTextInput", "Select Letter", choices = c("a", "b", "C"))
      )
      
    )
    
  })
}

shinyApp(ui, server)

主页上的可排序工作:

可排序在弹出模式中不起作用:

我看到这个链接问了同样的问题,但不是为了闪亮的包裹可分类 任何帮助表示赞赏

r shiny jquery-ui-sortable sortablejs shinyalert
1个回答
0
投票

问题

这里的问题是您试图在两个位置使用相同的 UI 对象:

rank_list_multi
出现在主
fluidPage
shinyalert
中。

您应该创建两个单独的可排序对象,每个对象都有一个独特的

input_id
。您可以使用我在下面构造的生成器函数来执行此操作。

示例解决方案

library(shiny)
library(sortable)
library(shinyalert)


#' Construct a sortable rank list object.
#' 
#' @param input_id The shiny ID used to construct the rank list.
construct_rank_list <- function(input_id) {
  sortable::rank_list(
    text = "Drag to Reorder",
    labels = c(1:5),
    input_id = input_id,
    options = sortable_options(multiDrag = TRUE)
  )
}


ui <- fluidPage(construct_rank_list("rank_list_multi"),
                actionButton("showAlert", "Show in popup"))


server <- function(input, output, session) {
  observeEvent(input$showAlert, {
    shinyalert::shinyalert(
      title = "Reorder this object",
      html = TRUE,
      closeOnClickOutside = TRUE,
      showConfirmButton = TRUE,
      text = tagList(
        construct_rank_list("rank_list_modal")
      )
    )
  })
}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.