簡體   English   中英

在R Shiny中,使用由先前選擇填充的SelectInput中的值

[英]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中的反應性會感到不舒服。 這不可避免地意味着需要在不同的時間進行評估。 當所有事物同時觸發並且所有反應性事物愉快地一起執行時,發光很容易。 但是即使在這種簡單的玩具情況下,我也意識到我需要在工具箱中使用其他工具。 任何幫助是極大的贊賞。

app.R

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 ,以防止代碼執行。

這是一個簡單的解決方案,在服務器中使用observeEventreactive ,然后在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM