[英]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_1
, 20546_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.