繁体   English   中英

R Shiny:根据用户输入切换数据集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM