[英]SelectInput Value update based on previous SelectInput in R shiny
[英]In R Shiny, use the value from an SelectInput that was populated by a previous choice
我有一個非常簡單的Shiny應用程序。
我想選擇一個ID和一個日期,並得到結果。
數據很簡單
DF_custs <- data.frame(ID=c(1,2,3,3), Date=c('1/1/2010', '1/1/2011', '1/1/2012', '1/1/2013'), result=c(100, 200, 300, 400))
UI已設置,當前看起來像這樣:
說,我選擇ID號3。然后,選擇日期菜單被填充。 接下來,我選擇一個日期。 到現在為止還挺好。
我的問題是,要顯示正確的結果取決於我剛剛選擇的日期,我需要實現哪種對象? 從目前的情況來看,缺少此功能,並且該應用程序無論如何都只是消除了兩種結果。
在尋求解決此問題時,我不確定SelectInput
是否會有用。 我看到與SelectInput
一起使用的renderUI
完成應做的工作,即在UI中呈現下拉菜單。 如何將SelectInput
的值發送回服務器?
我可以嘗試對output$result
進行某種修改,例如
output$result <- renderText({
ans <- get_cust()$result
ans <- ans[which(ans$Date==output$dates), Date]
paste("Result: ", ans)})
但現在我在一些神秘博士悖論其中ans
如果不能存在ans
並不存在。
對我來說,在最終結果之前,需要執行一系列操作時,使用Shiny中的反應性會感到不舒服。 這不可避免地意味着需要在不同的時間進行評估。 當所有事物同時觸發並且所有反應性事物愉快地一起執行時,發光很容易。 但是即使在這種簡單的玩具情況下,我也意識到我需要在工具箱中使用其他工具。 任何幫助是極大的贊賞。
DF_custs <- data.frame(ID=c(1,2,3,3), Date=c('1/1/2010', '1/1/2011', '1/1/2012', '1/1/2013'), result=c(100, 200, 300, 400))
DF_custs$Date <- as.character(DF_custs$Date)
## app.R ##
server <- function(input, output, session) {
get_cust <- reactive({
cust <- DF_custs[which(DF_custs$ID == input$ID), ]
return(cust)})
output$result <- renderText({
ans <- get_cust()$result
paste("Result: ", ans)})
output$dates<-renderUI({
selectInput('dates', 'Select date:', choices=get_cust()$Date, selected=get_cust()$Date)})
}
ui <- fluidPage(
numericInput(inputId="ID", label="Pick an ID: ", value=1),
uiOutput("dates"),
mainPanel(textOutput("result"))
)
shinyApp(ui = ui, server = server)
PS感謝@Victorp在這里的幫助。
再來一次,就做:
output$result <- renderText({
ans <- get_cust()$result
ans <- ans[DF_custs$Date[which(DF_custs$ID == input$ID)] == input$dates]
paste("Result: ", ans)
})
您可能可以做些更有效的事情,但是它會起作用,如果您想檢查是否已定義input$dates
則可以在!is.null(input$dates)
添加if
,以防止代碼執行。
這是一個簡單的解決方案,在服務器中使用observeEvent
和reactive
,然后在UI中使用selectInput
作為日期:
DF_custs <- data.frame(ID=c(1,2,3,3),
Date=c('1/1/2010', '1/1/2011',
'1/1/2012', '1/1/2013'),
result=c(100, 200, 300, 400))
DF_custs$Date <- as.character(DF_custs$Date)
server <- function(input, output, session) {
result <- reactive({paste("Result: ", input$ID, " @ ", input$Date) })
output$result <- renderText({ result()})
observeEvent(input$ID, {updateSelectInput(session, "Date",
choices=DF_custs[input$ID == DF_custs$ID, "Date"])})
}
ui <- fluidPage(
numericInput(inputId="ID", label="Pick an ID: ", value=1,
min=1, max=3, step=1),
selectInput(inputId="Date",label="Pick a date",
choices=c("Choose") , selectize = FALSE ),
mainPanel(textOutput("result"))
)
shinyApp(ui = ui, server = server)
希望這可以幫助! 還有更多的例子@ RStudio
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.