【问题标题】:Plot different reactive graph using different dataset and columns based on reacitve inputs in shiny根据闪亮的反应输入,使用不同的数据集和列绘制不同的反应图
【发布时间】:2023-04-01 20:25:02
【问题描述】:

我目前正在尝试自学闪亮,但遇到了一些麻烦。 我想制作一个应用程序,该应用程序具有用户想要从中绘制数据集的菜单,然后是他们想要绘制的变量的另一个菜单(针对日期列)

我已经设法让反应式菜单正常工作,但我正在努力弄清楚如何“调用”选定的数据集。我已经阅读了很多帖子(例如12),但似乎没有一个可以处理多数据集问题。

我的代码目前看起来像这样,我的问题出现在最后几行(如何在 outVar() 中访问 mydata?!?)。

如果有人能指出我正确的方向,那就太好了!

library(shiny)
library(ggplot2)

datafiles<-c("Data/try2.txt","Data/Poland.txt","Data/Romania.txt","Data/Hungary.txt","Data/KHR.txt")


runApp(list(
  ui = bootstrapPage(
    selectInput('dataset', 'Choose Dataset', datafiles),
    selectInput('columns', 'Columns', ""),
    plotOutput('graph')
  ),

  server = function(input, output, session){
    outVar = reactive({
      mydata = read.table(paste0(input$dataset), sep = '\t', header=TRUE)
      names(mydata)

    })
    observe({
      updateSelectInput(session, "columns",
                        choices = outVar()
      )})
    output$graph<-renderPlot({data<- outVar$mydata
    plot(data$Date,data$paste0(input$columns))})
  }
))

shinyApp(ui=ui, server=server)    

【问题讨论】:

  • 您的应用程序中是否收到错误消息?如果是这样,它在说什么?你试过数据
  • 刚刚尝试添加 outVar()$mydata,仍然得到相同的错误($ 中的错误:$ 运算符对原子向量无效)。
  • 我无法让您的代码处理我使用的数据。但是,我不断收到不同的错误。我在下面的答案中取出了观察事件。没有它,你应该能够做你想做的事。

标签: r shiny


【解决方案1】:

我没有你的数据,但是,我使用了葡萄酒质量数据来构建这个。 https://archive.ics.uci.edu/ml/datasets/Wine+Quality

希望对你有帮助

library(shiny)
library(tidyverse)
library(ggplot2)


datafile1 <- read_delim(file = "Data/winequality-red.csv", delim = ";")
datafile2 <- read_delim(file = "Data/winequality-white.csv", delim = ";")
# datafiles<-c("Data/try2.txt","Data/Poland.txt","Data/Romania.txt","Data/Hungary.txt","Data/KHR.txt")

datafiles <- list(datafile1, datafile2)

ui <- fluidPage(
  selectInput('dataset', 'Choose Dataset', choices = c("Red" = "1", "White" = "2")),
  selectInput('column', 'Choose column', choices = c("2" = "2", "3" = "3")),
  plotOutput('graph')
)

server = function(input, output, session){

  outVar <- reactive({
    temp <- datafiles[[as.numeric(input$dataset)]]
    temp <- temp[,c(1, as.numeric(input$column))]
  })

  output$graph <- renderPlot({
    plot(outVar())
  })
}


shinyApp(ui=ui, server=server)  

【讨论】:

  • 您好,感谢您的帮助!在第一行 temp
  • as.numeric 是必要的,因为当您从输入中进行选择时,您的选择被定义为字符而不是数字。您想更改为数字,以便您可以使用它来选择您的列。第一个临时行仅从数据集列表中选择数据集。第二个临时行有一个 1 和选定的列(我假设第一列是您的日期列)。所以它是逐步进行的,首先获取正确的数据,使其成为数据框,然后获取第一列和您从下拉列表中选择的列。
  • 我想问题是您的数据是如何结构化的?根据您的问题,我假设每个数据集都有几列,第 1 列是日期列,第 2 列,...,n 是您要针对日期绘制的某个值?我意识到你不需要包含上面的 as.data.frame,所以我把它拿出来了。
  • 嗨,对不起,我写了一个回复,但忘记发送了......这是漫长的一天。您正确地假设日期始终是第一列。只是当我运行代码时,它给出了强制引入的错误 NAs ...需要有限的 xlim 值。当我用两个相互绘制的数字列运行它时,它工作得很好!
  • 我认为情节的问题比应用程序本身的问题更大。如果您包括:output$table &lt;- renderTable({ outVar() }) 在您的服务器中,tableOutput('table') 在您的 UI 中的 plotOutput 下方,您应该会看到数据的结构。然后就是更新绘图功能或使用 ggplot 来做你想做的事。我无法访问时间序列数据,所以我无法提供更多帮助,但我认为您已经完成了 95% 的工作。如果这解决了您的问题,请务必标记并在有帮助时点赞
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2016-12-09
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多