如何在闪亮的模块中将值从 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()
我想将数据(静态)从 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()