【问题标题】:How do I create a dataframe from merging csv files and then create a shiny app based on it?如何通过合并 csv 文件创建数据框,然后基于它创建闪亮的应用程序?
【发布时间】:2022-01-08 21:51:33
【问题描述】:

我有一个可能很愚蠢的问题,但我只是想创建我的第一个 R 闪亮应用程序。我正在考虑编写一个代码,其中将读取 2 个单独的 csv 文件,然后将其组合成一个数据帧。在组合它们之前,我需要在每个数据框中添加几列,如代码所示。所以我想我可以在 ui 和服务器之外操作数据,然后创建应用程序,允许用户选择他们想要在每个轴上绘制的内容。闪亮部分之外的代码的第一部分工作正常,我得到了所需的组合数据框。但是,当我运行代码时,似乎没有创建数据框,因此我最终得到了一个空界面。

任何帮助将不胜感激!附上我有一张 csv 文件中列的图片,第二个 csv 文件类似。

shop1.csv

library(tidyverse)
library(shiny)

twofiles<-c("shop1.csv","shop2.csv")

shop_list<-lapply(twofiles, read.csv, header=TRUE, sep=",")

shop_list<- lapply(seq_along(shop_list), function(i){

df <- shop_list[[i]]
df<-transform(df,ratio1=price_apples/price_pears)
df<-transform(df,ratio2=price_apples/price_cherries)
df<-transform(df,datano=i)
})

finaldata <- do.call(rbind, shop_list)
finaldata$datano <- factor(finaldata$datano)


ui<-fluidPage(

titlePanel("Shops plots"),

sidebarMenu(

selectInput(inputId = "x", label = "Select x-axis:",
            choices = c("Year"="year","Hour"="hour"), selected="year"),

selectInput(inputId = "y", label = "Select y-axis:",
            choices = c("Ratio 1"="ratio1","Ratio 2"="ratio2"),selected="ratio1"),

mainPanel(
  plotOutput("plot")
)
)
)


server<-function(input, output) {


output$plot <-renderPlot({

ggplot(finaldata, aes(x=input$x, y=input$y, group=datano, color = datano)) +
  geom_line()

})
}

shinyApp(ui=ui, server=server)

【问题讨论】:

  • (1) 如果数据集在控制台上加载正常但在闪亮的应用程序中加载不正常,请确保工作目录正确。我不知道对您来说“运行闪亮”是否意味着 shiny::runApp 或部署到 shinyapps.io 或类似的。 (2) 请不要发布代码/数据/错误的图像:它会破坏屏幕阅读器并且无法复制或搜索(参考:meta.stackoverflow.com/a/285557xkcd.com/2116)。请直接包含代码、控制台输出或数据(例如,data.frame(...) 或来自dput(head(x)) 的输出)。
  • 非常感谢您的及时回复,我为图片道歉-我是新来的,我一定会记住这一点。至于 wd,它似乎没问题,通过运行闪亮我的意思是第一个选项。我想知道这个问题是否与反应性或类似的东西有关,但我无法确定它仍然是什么。它看起来像是构建应用程序的合理方式吗?在 ui 之前构建一个数据框,然后在服务器中工作?
  • 这项工作没有在 reactiveobserve 块内完成,甚至在服务器函数内也没有完成,所以我很难相信这个问题与闪亮的 直接相关.
  • 您对运行完整代码有什么建议吗?我曾尝试直接在服务器函数中操作/组合数据集(不使用响应式,因为我还没有完全掌握它,而是将代码粘贴到那里的 ui 之前),但这绝对行不通。
  • 如果您按照自己的方式编码,则必须使用aes_string 而不是aes。然后你应该在服务器端进行数据帧操作,包括加载等。还有一件事是group=datanocolor=datano 也可能容易出现问题。在这里试试yourdataframe$datano

标签: r dataframe csv shiny reactive


【解决方案1】:

对于 cmets 来说太长了:

这是mtcars 数据集的示例代码:

您必须在ggplot 中使用aes_string 而不是aes

数据框操作,包括加载等。应该在服务器端完成。

另一件事是group=datanocolor=datano 也可能容易出现问题。在这里试试yourdataframe$datano

library(shiny)
library(dplyr)
library(ggplot2)

ui<-fluidPage(
  
  titlePanel("XXX"),
  
  sidebarMenu(
    
    selectInput(inputId = "x", label = "Select x-axis:",
                choices = c("mpg"="mpg","disp"="disp"), selected="mpg"),
    
    selectInput(inputId = "y", label = "Select y-axis:",
                choices = c("hp"="hp","drat"="drat"),selected="hp"),
    
    mainPanel(
      plotOutput("plot")
    )
  )
)

server<-function(input, output,session) {
  
  output$plot <-renderPlot({
    
    ggplot(finaldata, aes_string(x=input$x, y=input$y, group=mtcars$cyl, color = mtcars$cyl)) +
      geom_line()
    
  })
}

shinyApp(ui=ui, server=server)

【讨论】:

  • 我在你之后发布...因为 aes_string 已被软弃用,如果你接受关于准引用的部分 (!!enquo(input$x)),我会很乐意删除我的支持这个。
  • 谢谢你亲爱的@r2evans。请留下您的答案/解释,这一如既往的好!!!
  • 非常感谢你们,我从没想过这是问题所在。您的两个答案都非常有用且内容丰富,而且这次确实奏效了。再次感谢您!
【解决方案2】:

我认为您遇到的问题与框架无关,而是与ggplot2 的编程使用有关。一般来说,查看ggplot2quasiquotation,您会发现自己陷入了您认为永远不需要(或者说从不知道您会需要,老实说)的 NSE(非标准评估)机制的泥潭中.

我可以用这个简单的不闪亮的例子来复制一些不工作的地方。

library(ggplot2)
input <- list(x = "mpg", y = "disp")

这会产生错误的图表,只是一个点:

ggplot(mtcars, aes(x=input$x, y=input$y)) + geom_point()

但是如果你切换到这个,它应该可以工作:

ggplot(mtcars, aes(x=!!sym(input$x), y=!!sym(input$y))) + geom_point()

也就是说,使用!!sym(input$x) 而不仅仅是input$x(以及您将放置在aes(...) 中的任何其他内容。

如果您好奇的话,旧的(软件已弃用)解决方案是使用 aes_string,它仍然有效(但我不知道能持续多久):

ggplot(mtcars, aes_string(x=input$x, y=input$y)) + geom_point()

旁注:

  • 我认为将您的数据读取为更直接(并且代码更简单):

    twofiles <- setNames(nm = c("shop1.csv","shop2.csv"))
    shop_list <- lapply(twofiles, read.csv, header=TRUE, sep=",")
    finaldata <- transform(
      dplyr::bind_rows(shop_list, .id = "datano"),
      ratio1 = price_apples/price_pears,
      ratio2 = price_apples/price_cherries,
      datano = factor(datano)
    )
    

    虽然您已经提取了所有 tidyverse,但您不妨切换到 dplyr 方法……这并不是说它在这里给您带来了很多好处。

【讨论】:

  • ggplot(mtcars, aes(x=.data[[input$x]], y=.data[[input$y]])) + geom_point() 也是有效的。
猜你喜欢
  • 2021-12-02
  • 2022-12-17
  • 1970-01-01
  • 2021-09-26
  • 2017-04-24
  • 2014-10-28
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多