簡體   English   中英

根據用戶輸入動態子集數據幀,並將結果表顯示為 Shiny 應用程序中的另一個用戶輸入

[英]Subsetting a dataframe dynamically based on user input and presenting the resulting table as another user input in a Shiny app

我是 Shiny 的新手並嘗試執行以下操作 - 我有一個 csv 文件,其中有兩列 - ID 和名稱。 在ui端,用戶可以輸入一個ID(textInput)。 在服務器端,我將 csv 文件作為數據幀讀取,並根據用戶定義的 textInput,對數據幀進行子集化。 我想將生成的數據幀(子集化后)呈現為另一個用戶輸入,每行旁邊都有一個復選框。 我不知道從哪里開始。

    ui <- fluidPage(
          useShinyjs(), #include shinyjs

           # Application title
           titlePanel(fluidRow(
             column(3, "  ADVANCE DATA RETRIEVAL",align="center"),
             column(2, offset = 0,img(height =90,width=250,src="logo.png",align="left"))

           )),


           sidebarLayout(sidebarPanel(width = 5,
                                      helpText("Please enter a station ID."),textInput("stationID", "IDs", value = ""),
                                      actionBttn("goButton","Go!",color = "default",style = "fill",size = "lg")), 
                                      mainPanel(width = 6,tableOutput("results"))))

    server <- function(input, output, session) {
    TS_metadata<-eventReactive(input$goButton,{
    PRECIP<-read.csv("Precip.csv", header = TRUE)
    Subset_Precip<-subset(PRECIP, PRECIP$ID==input$stationID)
    )}
}

PRECIP.csv 看起來像-

在此處輸入圖片說明

如果 input$stationID = 17517 則結果數據幀有前兩行,我希望數據幀(有兩行)顯示為用戶輸入,其中每一行旁邊都有一個復選框。 我在這里展示了幾行代碼,以了解我正在嘗試做什么。 任何幫助是極大的贊賞。 謝謝。

這是一個簡短的演示,包括DT復選框。 這是基於 yihui 在 github 響應中提供的解決方案

這種方法會將您的子集數據保存在reactiveVal以供使用。 復選框是動態生成的,並使用輸入的ID號作為復選框輸入。 例如,選定的ID 20546 將使第一個復選框為20546_2 ,第二個為20546_120546_2 ,因此在您更改數據文件時每個都是唯一的(只是為了演示)。

另一個輸出顯示了如何檢索復選框結果 (TRUE/FALSE)。

library(shiny)
library(DT)
library(shinyjs)
library(shinyWidgets)


ui <- fluidPage(
    useShinyjs(), #include shinyjs
    # Application title
    titlePanel(
      fluidRow(
        column(3, "  ADVANCE DATA RETRIEVAL",align="center"),
        column(2, offset = 0,img(height =90,width=250,src="logo.png",align="left"))
    )),
    sidebarLayout(
      sidebarPanel(
        width = 5,
        helpText("Please enter a station ID."),textInput("stationID", "IDs", value = ""),
        actionBttn("goButton","Go!",color = "default",style = "fill",size = "lg")), 
      mainPanel(
        width = 6,
        DT::dataTableOutput("results"),
        verbatimTextOutput('cbinfo')
      )
    )
  )

server = function(input, output, session) {

  Subset_Precip <- reactiveVal(NULL)

  TS_metadata <- observeEvent(input$goButton,{
    PRECIP<-read.csv("Precip.csv", header = TRUE)
    Subset_Precip(subset(PRECIP, PRECIP$ID==input$stationID))
  })

  # create a character vector of shiny inputs
  shinyInput = function(FUN, len, id, ...) {
    inputs = character(len)
    for (i in seq_len(len)) {
      inputs[i] = as.character(FUN(paste0(id, i), label = NULL, width = 1, ...))
    }
    inputs
  }

  # obtain the values of inputs
  shinyValue = function(id, len) {
    unlist(lapply(seq_len(len), function(i) {
      value = input[[paste0(id, i)]]
      if (is.null(value)) NA else value
    }))
  }

  dataCB <- reactive({
    if (is.null(Subset_Precip())) return(data.frame(NULL))
    data.frame(
      v1 = shinyInput(checkboxInput, nrow(Subset_Precip()), paste0(input$goButton, '_'), value = TRUE),
      v2 = Subset_Precip()$ID,
      v3 = Subset_Precip()$Name,
      stringsAsFactors = FALSE
    )
  })

  # render the table containing shiny inputs
  output$results = DT::renderDataTable(
    dataCB(), server = FALSE, escape = FALSE, selection = 'none', options = list(
      preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
      drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
    )
  )

  # print the values of inputs
  output$cbinfo = renderPrint({
    if (is.null(Subset_Precip())) return (NULL)
    data.frame(v1 = shinyValue(paste0(input$goButton, '_'), nrow(Subset_Precip())))
  })
}

shinyApp(ui, server)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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