r-第一次上传文件时,Actionbutton停止显示数据表



下面有一个闪亮的应用程序,用户可以在其中上传csv。然后,pickerInput获取csv的第一列的唯一值,并使用它们对数据帧进行子集设置并将其显示在表中。问题是,我想使用actionButton来应用更改,但当csv第一次上传时,它应该显示为满,而不是显示为空,因为actionButton尚未触发。为了示例的目的,我使用了iris数据集,而不是csv。

# app.R ##
library(shiny)
library(DT)
library(shinyWidgets)
ui <- pageWithSidebar(
headerPanel('Iris k-means clustering'),
sidebarPanel(
fileInput("file1", "Choose CSV File",
accept = c(
"text/csv",
"text/comma-separated-values,text/plain",
".csv")
),
uiOutput("id"),
actionButton("go","Go")
),
mainPanel(
uiOutput('contents')
)
)
server <- function(input, output, session) {
output$id<-renderUI({
#inFile <- input$file1
#df2<-data.frame(read.csv(inFile$datapath, header = TRUE))
pickerInput("select", "Select ID", 
choices = as.character(unique(iris$Species)), 
multiple = T,options = list(`actions-box` = TRUE),
selected = as.character(unique(iris$Species)))
})
output$contents <- renderUI({
input$goButton
#inFile <- input$file1
#df<-data.frame(read.csv(inFile$datapath, header = TRUE))
df<-data.frame(iris)
df<-subset(iris,Species %in% isolate(input$select))
renderDataTable({
datatable(
df,
options = list(scrollX = TRUE,pageLength=5)
)
})
})
}
shinyApp(ui = ui, server = server)
library(shiny)
library(DT)
library(shinyWidgets)
ui <- pageWithSidebar(
headerPanel('Iris k-means clustering'),
sidebarPanel(
fileInput("file1", "Choose CSV File",
accept = c(
"text/csv",
"text/comma-separated-values,text/plain",
".csv")
),
uiOutput("picker"),
actionButton("go","Go")
),
mainPanel(
DTOutput("dtable")
)
)
server <- function(input, output, session) {
filteredCSV <- reactiveVal(NULL)
CSV <- eventReactive(input[["file1"]], {
dat <- read.csv(input[["file1"]]$datapath, header = TRUE)
filteredCSV(dat)
dat
})

output[["picker"]] <- renderUI({
req(CSV())
choices <- unique(as.character(CSV()[,1]))
pickerInput("select", "Select ID", 
choices = choices, 
multiple = TRUE, options = list(`actions-box` = TRUE),
selected = choices)
})
observeEvent(input[["go"]], {
req(CSV())
filteredCSV(CSV()[CSV()[,1] %in% input[["select"]],])
})
output[["dtable"]] <- renderDT({
req(filteredCSV())
datatable(
filteredCSV(), 
options = list(scrollX = TRUE, pageLength = 5)      
)
})
}
shinyApp(ui = ui, server = server)

这是对您文章的前一版本的回复,但应该可以解决主要问题-这就是我将如何进行的,使用反应式表达式(和data.table,但您最好不要使用它(:

library(shiny)
library(shinyWidgets)
library(DT)
library(data.table)
ui <- pageWithSidebar(
headerPanel('Iris k-means clustering'),
sidebarPanel(
fileInput("file1", "Choose CSV File",
accept = c(
"text/csv",
"text/comma-separated-values,text/plain",
".csv")
),
uiOutput("id"),
#actionButton("go","Go")
),
mainPanel(
DT::dataTableOutput('contents')
)
)
server <- function(input, output, session) {
getFile <- reactive({
req(input$file1)
fread(input$file1$datapath, header = TRUE)
})
output$contents <- DT::renderDataTable({
DT::datatable(getFile()[get(colnames(getFile())[1]) %in% input$select])
})
output$id <- renderUI({
req(getFile())
df <- getFile()
pickerInput("select", "Select ID", 
choices = unique(df[[1]]), 
multiple = TRUE, options = list(`actions-box` = TRUE),
selected = unique(df[[1]]))
})
}
shinyApp(ui = ui, server = server)

最新更新