R 闪亮密度图

R Shiny Density Plots

我正在做一个项目,我们必须创建一个显示数据的 R Shiny 应用程序。我有四个定量变量(个人、社会、体重和饮食)。当在应用程序中指定时,我希望在学校的每一年和每个性别都有 4 个密度图相互重叠。密度图不会显示,无论我做什么,它们都不会显示。任何建议都会很有帮助!

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

#plotting theme for ggplot2
.theme<- theme(
  axis.line = element_line(colour = 'gray', size = .75),
  panel.background = element_blank(),
  plot.background = element_blank()
)


# UI for app
ui<-(pageWithSidebar(
  # title
  headerPanel("Select Options for Body Image and Disordered Eating Among UW-Madison Students"),

  #input
  sidebarPanel
  ( # Input: Select what to display
  selectInput("gender", "Gender:",
                  choices = c("Female", 
                            "Male",
                            "Nonbinary", 
                            "Do not care to say"),
                  selected = "Female"),
    selectInput("school", "Year in School:",
                  choices = c("First Year", 
                            "Second Year",
                            "Third Year",
                            "Fourth Year"),
                  selected = "First Year")),
  mainPanel(plotOutput("densityplot"))
  )
)


# --------------------------------------------SERVER---------------------------------------------
server<-(function(input, output){
  output$plot <- renderUI({
    plotOutput("p")
    
    data = switch(input$gender,
                  "Female"="Female", 
                  "Male"= "Male",
                  "Nonbinary"= "Nonbinary", 
                  "Do not care to say" = "Do not care to say")  
    data = switch(input$school,
                  "First Year"="First Year", 
                  "Second Year"= "Second Year",
                  "Third Year"= "Third Year", 
                  "Fourth Year" = "Fourth Year")    
    data = switch(output$var,
                  "Personal"= cleandatafull$personal, 
                  "Social"= cleandatafull$social,
                  "Weight"= cleandatafull$weight, 
                  "Eating" = cleandatafull$eating)
    
     output$densityplot<-renderPlot({
      
      ggplot(cleandatafull, aes(x=output$var)) +
        geom_density(adjust=1.5, alpha=.4)  })
 # There is something going wrong here with the density plot and I just want something to show up so I can fix it to look how I want it to.
     
  })
  })
  


shinyApp(ui, server)

我无权访问您的数据,但我知道是什么导致您的绘图未出现在您的代码中。简而言之,您的情节代码永远不会 运行,这就是为什么您什么都看不到的原因......即使它确实 运行,您也可能会收到所写的错误。

为什么什么都看不见?

你的server代码结构如下:

server <-...
  output$plot <- renderUI({...
    plotOutput("p")

    output$densityplot <- renderPlot({...})
  })

ui 只命名了一个输出函数,即 output$densityplot。这部分永远不会是 运行,因为它在 output$plot 的内部,在 UI 的任何地方都找不到引用。这就是为什么你什么都看不见的原因。 output$plot 中的所有代码永远不会 运行,因为在 ui 中没有以该名称引用的输出对象。

如果你将 output$densityplot 拉到 output$plot 之外,它 运行,但你肯定会出错,正如你所引用的对于 x 轴美学 aes(output$var)。您引用了一个 output 对象,该对象将位于 server 函数内部,因此不在 ui.

你如何解决这个问题?

老实说,具体解决这个问题有点过分,而且您还没有共享数据。我可以向您展示一个工作示例,说明我将如何处理您的一般问题。也就是说,您似乎希望根据用户 select 编辑的 UI 元素更改或过滤图中显示的数据。

您可以使用几种方法,但我喜欢使用的一般想法是创建一个反应函数来输出将用于绘图的数据框。在反应函数内部,我将放置我可能想要用于过滤数据集的所有元素,然后反应函数返回的数据帧用于与 plotOutput() 关联的 renderPlot() 函数在 ui.

中命名的对象

在下面的示例中,我正在创建一个应用程序来为 diamonds 数据集创建密度曲线。我给 select x 轴一个下拉菜单,然后是其他 3 个允许过滤数据集的下拉菜单。我还添加了一些逻辑和功能,以允许在用户 select 在其中每个中选择“全部”时不过滤数据集(默认)。

这里有一些最后的注意事项:我使用 aes_string(input$s_axis) 代替 aes(...)。原因是从 input$s_axis 获得的输出将是字符类型,而不是列名。您使用 get()aes(),但 aes_string() 在这里更简单一些并且工作正常。其次,我经常发现明确 print() renderPlot() 内的情节通常更好,尽管这不是严格要求的。

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


ui <- pageWithSidebar(
  headerPanel('Example of Filtering a Plot'),
    sidebarPanel(
      h3("Filters"),
      selectInput("s_color", label="Color:", choices = c("All", as.character(unique(diamonds$color)))),
      selectInput("s_cut", label="Cut:", choices=c("All", as.character(unique(diamonds$cut)))),
      selectInput("s_clarity", label="Clarity:", choices=c("All", as.character(unique(diamonds$clarity)))),
      br(),
      selectInput("s_axis", label="X Axis:", choices=c("carat","price", "depth", "table"))
    ),
    mainPanel(plotOutput('dazzle'))
)

server <- function(input, output) {
  
  glittering_diamonds <- reactive({
    d <- diamonds
    if(input$s_color != "All")
      d <- d %>% dplyr::filter(color==input$s_color)
    if(input$s_cut != "All")
      d <- d %>% dplyr::filter(cut==input$s_cut)
    if(input$s_clarity != "All")
      d <- d %>% dplyr::filter(clarity==input$s_clarity)
    return(d)
  })
    
  output$dazzle <- renderPlot({
    p <- ggplot(glittering_diamonds(), aes_string(x=input$s_axis)) +
      geom_density(fill='blue', alpha=0.2) +
      theme_classic()
    print(p)
  })
}

shinyApp(ui = ui, server = server)

以此为灵感,祝你的项目好运。