[英]R Shiny: Switching datasets based on user input
我正在开发一个闪亮的应用程序,用户可以上传自己的数据并获取一些情节和统计数据。 但是,如果用户按下特定按钮,我还想包含一个示例数据集。 重要的是,这些图应该是被动的,以便用户在点击“使用示例数据”按钮或上传新文件时获得更新的图表。 我尝试重新创建当前覆盖数据对象的方法尽可能最好,但只是定义数据对象两次不会以我希望的方式覆盖数据。 任何建议表示赞赏。
library(shiny)
# UI
ui <- fluidPage(
# Application title
titlePanel("Reproducible Example"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
fileInput("Upload", "Upload your own Data"),
actionButton("Example", "Use Example Data instead")
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("hist")
)
)
)
# Server Logic
server <- function(input, output) {
data <- eventReactive(input$Upload,{input$Upload})
data <- eventReactive(input$Example, {faithful$eruptions})
output$hist <- renderPlot({hist(data())})
}
# Run the application
shinyApp(ui = ui, server = server)
您可以像这样使用reactiveVal
:
server <- function(input, output) {
my_data <- reactiveVal()
observeEvent(input$Upload, {
tmp <- read.csv(input$Upload$datapath)
## do whatever is needed to parse the data
my_data(tmp)
})
observeEvent(input$Example, {
my_data(faithful)
})
output$hist <- renderPlot({
dat <- as.data.frame(req(my_data()))
dat <- dat[, sapply(dat, is.numeric), drop = FALSE]
validate(need(NCOL(dat) > 1, "No numeric columns found in provided data"))
hist(dat[,1])
})
}
根据上传或按钮单击,您将数据存储在my_data
,这是一个my_data
值。 只要此值发生更改, renderPlot
函数就会触发并使用正确的数据。
您可以使用无效值来访问用户是选择使用示例数据集还是使用自己的数据集。 用户可以选择使用UI中的输入在活动数据集之间切换。
以下是来自RStudio的反应值的官方解释: link
这将在你的ui.R
:
radioButtons("sample_or_real",
label = h4("User data or sample data?"),
choices = list(
"Sample Data" = "sample",
"Upload from user data" = "user",
),
selected = "user"
)
这将进入你的server.R
:
data_active <- reactive({
# if user switches to internal data, switch in-app data
observeEvent(input$sample_or_real_button, {
if(input$sample_or_real == "sample"){
data_internal <- sample_data_object
} else {
data_internal <- uploaded_data_object
}
})
请注意,在server.R
文件中使用反应值时,它必须在对象名称的末尾有括号()
。 因此,您将data_internal对象称为data_internal()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.