2

我想将数据(静态)从 ui 传递到闪亮模块中的服务器。对于我正在处理的问题的具体示例,请考虑下面的应用程序。我希望能够使用按钮来旋转无线电输入。但是,因为我没有服务器中的 radioInput 选项,所以我无法使用下一个选项更新 radioInput。

当然有一些可能的解决方案。第一个是将radioInput 选项列表传递给服务器函数。我想避免在 ui 和 server 两个地方传递这些数据。第二个选项是使用 renderUI 并将选择列表从服务器传递到 ui,但鉴于 UI 没有动态方面,这也是不可取的。

有没有一种干净的方法可以将静态数据从 ui 传递到服务器?

library(shiny)

rotatingRadioInput <- function(id, label, choices = c('A' = 'a', 'B' = 'b'), selected = 'a') {
  labelNames <- names(choices)
  values <- unname(choices)

  tagList(
    radioButtons(NS(id, "radio"), 
                 label = NULL,
                 choiceValues = values,
                 choiceNames = labelNames,
                 selected = selected
    ),
    actionButton(NS(id, 'rotate'), 'rotate')
  )
}

rotatingRadioServer <- function(id) {
  moduleServer(id, function(input, output, session) {
    observeEvent(input$rotate, {
      updateRadioButtons(session, "radio", selected = "next radio option")
    })
    
    reactive({
      input$radio
    })
  })
}

rotatingRadioApp <- function() {
  ui <- fluidPage(
    rotatingRadioInput("rotate"),
    textOutput("value")
  )
  server <- function(input, output, server) {
    rotatingValue <- rotatingRadioServer("rotate")
    output$value <- renderText(paste0("Selected: ", rotatingValue()))
  }
  
  shinyApp(ui, server)
}
4

1 回答 1

0

一种方法是使用隐藏selectInput的所有选项。 Shinyjs包是必需的。试试这个

library(shiny)
library(shinyjs)

rotatingRadioInput <- function(id, label, choices = c('A' = 'a', 'B' = 'b'), selected = 'a') {
  labelNames <- names(choices)
  values <- unname(choices)

  tagList(
    radioButtons(NS(id, "radio"),
                 label = NULL,
                 choiceValues = values,
                 choiceNames = labelNames,
                 selected = selected
    ),
    actionButton(NS(id, 'rotate'), 'rotate'),
    hidden(selectInput(NS(id,"mychoices"),"", choices=values, selected=values, multiple=TRUE))
  )
}

rotatingRadioServer <- function(id) {
  moduleServer(id, function(input, output, session) {

    observeEvent(input$rotate, {
      choices <- input$mychoices
      newchoices <- choices[!(choices %in% input$radio)]
      updateRadioButtons(session, "radio", selected = newchoices[1])
    })
    reactive({input$radio})
    # return(reactive({input$radio}))
  })
}

#rotatingRadioApp <- function() {
  ui <- fluidPage(
    useShinyjs(),
    rotatingRadioInput("rotate"),
    textOutput("value")
  )
  server <- function(input, output, server) {
    rotatingValue <- rotatingRadioServer("rotate")
    #observe({print(rotatingValue())})
    output$value <- renderText(paste0("Selected: ", rotatingValue()))
  }

  shinyApp(ui, server)
#}

#rotatingRadioApp()

输出

于 2021-09-20T00:34:21.350 回答