如何在闪亮的模块中将值从 ui 传递到服务器

How to pass values from ui to server in a shiny module

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

当然有一些可能的解决方案。第一个是将 radioInput 选择列表传递给服务器函数。我想避免在 ui 和服务器这两个地方传递这些数据。第二种选择是使用 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)
}

一种方法是使用隐藏的 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()