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的主要内容,如果未能解决你的问题,请参考以下文章