【问题标题】:R Shiny: Switching datasets based on user inputR Shiny:根据用户输入切换数据集
【发布时间】:2019-08-01 08:16:27
【问题描述】:

我正在开发一个闪亮的应用程序,用户可以在其中上传自己的数据并获取一些图表和统计数据。但是,我还想包含一个示例数据集,如果用户按下特定按钮,则会使用该示例数据集。重要的是,绘图应该是反应性的,以便用户在单击“改用示例数据”按钮或上传新文件时获得更新的绘图。我试图在这里尽可能地重新创建我当前的覆盖数据对象的方法,但是简单地定义数据对象两次并不会以我希望的方式覆盖数据。任何建议表示赞赏。

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)

【问题讨论】:

    标签: r shiny reactive


    【解决方案1】:

    您可以像这样使用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 中,这是一个反应值。每当此值更改时,renderPlot 函数就会触发并使用正确的数据。

    【讨论】:

      【解决方案2】:

      您可以使用响应值来访问用户是选择使用示例数据集还是使用他们自己的数据集。用户可以选择使用来自 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()

      【讨论】:

      • 感谢您的解决方案和代码!我也在考虑这个问题并且不愿意尝试它,因为我已经在页面上有很多带有单选按钮的设置,并且想让示例成为单个按钮。我想我会尝试 thotals 建议,如果我无法实现它,我会回退到单选按钮方法。
      • 乐于助人。我一直在用这个应用程序 EviAtlas 做类似的事情,如果你想查看它并解除一些代码:github codelive app
      猜你喜欢
      • 2017-05-17
      • 2022-01-20
      • 2018-03-22
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多