我需要使用renderUI基于另一個輸入值創建多個輸入選項。我想將所有內容都包裝renderUI成一個函式,這樣我就可以將其應用于許多類似的輸入。這是一個簡化的示例(這對我有用,但我不想renderUI多次重復該部分,因為我還有許多其他輸入,例如i1):
library(shiny)
ui <- fluidPage(
fluidRow(
selectInput(
inputId = 'i1',
label = 'choice 1',
choices = list(5, 10)
),
uiOutput('o1')
)
)
server <- function(input, output, session) {
output$o1 <- renderUI(
fluidRow(
sliderInput(
inputId = 's1',
label = 'slider 1',
min = 0, max = as.numeric(input$i1) * 10,
value = 0.5
),
sliderInput(
inputId = 's2',
label = 'slider 2',
min = 0, max = as.numeric(input$i1) * 100,
value = 0.5
)
)
)
}
shinyApp(ui = ui, server = server)
問題是,當我嘗試將它包裝到一個函式中時,renderUI當我更改輸入值時,輸出會停止更新。這是對我不起作用的代碼:
library(shiny)
renderUI_warpper <- function(i){
renderUI(
fluidRow(
sliderInput(
inputId = 's1',
label = 'slider 1',
min = 0, max = as.numeric(i) * 10,
value = 0.5
),
sliderInput(
inputId = 's2',
label = 'slider 2',
min = 0, max = as.numeric(i) * 100,
value = 0.5
)
)
)
}
ui <- fluidPage(
fluidRow(
selectInput(
inputId = 'i1',
label = 'choice 1',
choices = list(5, 10)
),
uiOutput('o1')
)
)
server <- function(input, output, session) {
output$o1 <- renderUI_warpper(input$i1)
}
shinyApp(ui = ui, server = server)
uj5u.com熱心網友回復:
雖然我不認為這樣做有什么意義,因為即使您將該部分移動到一個函式,您仍然必須定義 each sliderInput,這是一種方法。
關鍵是你應該包裝 Input 而不是renderUI,因為你需要反應式運算式才能更新輸入并且反應式只能在另一個反應式或render*函式中作業
library(shiny)
ui <- fluidPage(
fluidRow(
selectInput(
inputId = 'i1',
label = 'choice 1',
choices = list(5, 10)
),
uiOutput('o1')
)
)
server <- function(input, output, session) {
wrapper <- reactive({
function(i){
fluidRow(
sliderInput(
inputId = 's1',
label = 'slider 1',
min = 0, max = as.numeric(i) * 10,
value = 0.5
),
sliderInput(
inputId = 's2',
label = 'slider 2',
min = 0, max = as.numeric(i) * 100,
value = 0.5
)
)
}
})
output$o1 <- renderUI(wrapper()(input$i1))
}
shinyApp(ui = ui, server = server)
uj5u.com熱心網友回復:
這是一個可能的替代方案:
library(shiny)
create_sliders <- function(i) {
fluidRow(
column(
width = 12,
sliderInput(
inputId = "s1",
label = "slider 1",
min = 0, max = as.numeric(i) * 10,
value = 0.5
),
sliderInput(
inputId = "s2",
label = "slider 2",
min = 0, max = as.numeric(i) * 100,
value = 0.5
)
)
)
}
ui <- fluidPage(
fluidRow(
selectInput(
inputId = "i1",
label = "choice 1",
choices = list(5, 10)
),
uiOutput("o1")
)
)
server <- function(input, output, session) {
output$o1 <- renderUI({
create_sliders(input$i1)
})
}
shinyApp(ui = ui, server = server)

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394665.html
下一篇:R中的trycatch范圍
