我正在学习一些闪亮的东西来做一个仪表板。我有个主意。我想创建一个仪表板,从selectinput中选择一个变量,按该变量分组,然后绘制该变量总数的条形图或直方图。
我已经生成了一个样本数据集来生成所需的内容,但是我找不到所需的内容。
UI代码是下一个:
library(shiny)
shinyUI(fluidPage(
titlePanel("Demo dashboard"),
sidebarLayout(
sidebarPanel(
selectInput("variable",
"group by",
choices = c("City","Country")
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
服务器代码是下一个,在这里,我根据输入的变量进行汇总并绘制总计
library(shiny)
library(dplyr)
shinyServer(function(input, output) {
output$distPlot <- renderPlot({
sample<-tbl_df(data.frame(c("City1","City2","City3","City1","City2","City3","City2","City3"),
c("A","B","C","D","D","A","A","B"),
c(12,14,15,12,12,14,8,10)))
colnames(sample)<-c("City","Country","Amount")
df1<-sample%>%group_by(input$variable)%>%
summarise(total=sum(Amount))
sample%>%group_by(input$variable)%>%summarise(total=sum(Amount))
x<- df1$total
hist(x)
})
})
下一个是我的结果的屏幕截图:
但是,这不是预期的结果。我无法获得所需的直方图
答案 0 :(得分:0)
问题是您使用dplyr
:
您的原始代码不会将input$variable
评估为按城市分组,而是尝试按不存在的称为“ input $ variable”列的分组:
sample %>%
group_by(input$variable) %>%
summarise(total=sum(Amount))
结果:
# # A tibble: 1 x 2
# `input$variable` total
# <chr> <dbl>
# 1 City 97
您可以通过在语句之后添加打印语句(例如:print(df1)
)或在语句之前添加browser()
来轻松地进行检查。
此行为是因为dplyr
默认使用非标准评估。您可以阅读有关here的更多信息。
要使用标准(可编程)评估,您需要取消引用 input$variable
,以便将该值传递给dplyr。在当前版本中,您可以结合使用!!
和sym
来做到这一点。
示例:
sample %>%
group_by(!!sym(input$variable)) %>%
summarise(total=sum(Amount))
结果:
# # A tibble: 3 x 2
# City total
# <fct> <dbl>
# 1 City1 24
# 2 City2 34
# 3 City3 39
编辑:更多解释:group_by
不评估其输入,但引用它:这就是为什么您得到`input $ variable` 作为列名。
另一方面:sym
函数将input$variable
的实际值转换为符号,然后可以使用!!
删除引号:
在dplyr中有效的是,如果您在输入中没有引号,那么:group_by(City)
让我们一步一步来看看:
sym(input$variable)
返回“城市”。 group_by("City")
仍然无法正常工作,因为输入内容用引号引起了!!!
的原因:!! sym(input$variable)
返回不带引号的城市。因此该表达式的值为group_by(City)
,因此将按预期工作。