R闪亮:如何将滑块和单选按钮链接到ggplot

Posted

技术标签:

【中文标题】R闪亮:如何将滑块和单选按钮链接到ggplot【英文标题】:R shiny: how to link slider and radio buttons to ggplot 【发布时间】:2018-11-06 01:11:50 【问题描述】:

我对 Shiny 很陌生,并没有成功阅读过其他类似的帖子,包括:R shiny plots based on radio buttons and slider input

我想绘制健康结果(从单选按钮中选择)v 自付费用 (OOP),年份基于滑块

这是我目前的代码,图没有显示

用户界面:

 library(shiny)
 library(ggplot2)

 data <- read.csv("data.csv", header=TRUE)
 data

 data$OOP <- as.numeric(data$OOP)
 data$OOP

  shinyUI(fluidPage(
    titlePanel(title=h3("Out of pocket expenditure on health")),

    mainPanel(
      h5(textOutput("subheading")),
      plotOutput("view")),

    fluidRow(
        column(5,
           radioButtons("outcome", label=h4("Select Health Outcomes"),
                    choices=list("Mortality rate (per 100,000)", "Premature death risk (age 30-70)"), selected="Mortality rate (per 100,000)"),

           checkboxInput("smooth", "Add trend line")
),
        column(5,
            sliderInput("years", label=h4("Year"),
                   min=min(data$Year), max=max(data$Year), value=(min(data$Year)), step=5, sep="", animate=TRUE)
)
 )
   ))

服务器:

library(dplyr)
library(ggplot2)

shinyServer(
    function(input, output)
    formulaText <- reactive(
        paste("Health outcome:",input$outcome)
            )
        output$subheading <- renderText(formulaText())

     datareact <- reactive(
        data %>%
        filter(Year == input$years) %>%
        select(Country, OOP, Mortality, Probability)
            )

     output$view <- renderPlot(
        p <- ggplot(datareact(), aes(x=OOP, y=input$outcome))+
           geom_point(aes(fill=Country))

        if(input$smooth)
           p <- p + geom_smooth()  
           )
         )

'reactive' 和 'renderPlot' 行可能有问题。非常感谢任何帮助,谢谢

*编辑: 这是我的数据 (sn-p) 的样子:

      Country Year     OOP Mortality Probability
1 Afghanistan 2000 No data     934.3        34.2
2 Afghanistan 2005      79     947.7        33.6
3 Afghanistan 2010      79     919.6        32.2
4 Afghanistan 2015    78.4     898.0        31.0
5     Albania 2000    64.6     710.3        20.0
6     Albania 2005    52.5     688.9        19.7

【问题讨论】:

我的猜测是input$outcome 正在传递一个字符串。 aes 不喜欢那个。试试aes_string 【参考方案1】:

一如既往地使用dput 发布可重现的数据,预期的输出很有帮助。但是,这是我的解决方案,如果需要更新,请告诉我。

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

#No data changed to NA
Input = ("Country Year     OOP Mortality Probability
   1 Afghanistan 2000 NA     934.3        34.2
   2 Afghanistan 2005      79     947.7        33.6
   3 Afghanistan 2010      79     919.6        32.2
   4 Afghanistan 2015    78.4     898.0        31.0
   5     Albania 2000    64.6     710.3        20.0
   6     Albania 2005    52.5     688.9        19.7")

data = read.table(textConnection(Input),header=TRUE)


ui <- shinyUI(fluidPage(
          titlePanel(title=h3("Out of pocket expenditure on health")),

      mainPanel(
        h5(textOutput("subheading")),
        plotOutput("view")),

     fluidRow(
        column(5,
               radioButtons("outcome", label=h4("Select Health Outcomes"),
                    choices=c("Mortality rate", "Premature death risk (age 30-70)"), selected="Mortality rate"),

             checkboxInput("smooth", "Add trend line")
       ),
         column(5,
               sliderInput("years", label=h4("Year"),
                   min=min(data$Year), max=max(data$Year), value=(min(data$Year)), step=1, sep="", animate=TRUE)
       )
     )
 ))


server <- shinyServer(function(input, output, session)
formulaText <- reactive(
  paste("Health outcome:",input$outcome)
)
output$subheading <- renderText(formulaText())

datareact <- reactive(
  print(input$years)      #to check variable before passing 
  print(input$outcome)
  data <- data %>%
  #change input$outcome from renderPlot to reactive
  filter(Year >= input$years)

if (input$outcome == "Mortality rate") data$outcome <- data$Mortality else 
  data$outcome <- data$Probability    #Please note this is not the best solution for large data set 
  
data
)

observe(print(datareact()))   #to check which data you get

output$view <- renderPlot(

  p <- ggplot(datareact(), aes(x=OOP, y=outcome, color=Country))+
    geom_point()

  if(input$smooth)
    p <- p + geom_smooth()

       p   #Enforce renderPlot to return p 
     )
  )

 shinyApp(ui,server)

【讨论】:

感谢您的回复@A.Suliman - 我已在原始帖子中添加了我的数据。运行您的代码后,我收到“警告:filter_impl 中的错误:评估错误:找不到对象'结果'。167:”您能否提供进一步的想法?谢谢 您的数据不包括结果变量,您计划如何绘制ggplot(datareact(), aes(x=OOP, y=input$outcome)) 我希望根据作为 y 变量的单选按钮输入绘制所有国家/地区的“死亡率”v“OOP”和“概率”v“OOP”(选择死亡率或概率) .还有用于选择年份的滑块。我希望这是有道理的?我为混乱道歉 非常感谢您的努力和回复。当我尝试运行时,不幸的是我得到:警告:UseMethod 中的错误:没有适用于“filter_”的方法应用于“函数”类的对象。也许在“反应”功能中有些东西?我会很感激任何想法,谢谢 感谢您的建议 - 演示文稿的目的是分别讨论这些结果,所以我认为最好不要一起显示。不过可能会制作一个有趣的情节。再次感谢,AK

以上是关于R闪亮:如何将滑块和单选按钮链接到ggplot的主要内容,如果未能解决你的问题,请参考以下文章

R 闪亮的反应单选按钮

GetCheck() 适用于检查按钮但不适用于单选按钮?

如何使下拉列表和单选按钮只读? [复制]

带有选择、复选框和单选按钮的 Angular JS 表单

R中的闪亮:单击按钮后如何将输入值设置为NULL?

如何在复选框和单选按钮中设置默认值?