闪亮的情节不会随着输入而改变
Posted
技术标签:
【中文标题】闪亮的情节不会随着输入而改变【英文标题】:Shiny plot doesn't change with inputs 【发布时间】:2019-01-21 17:14:10 【问题描述】:我是 Shiny 的绝对初学者,因此非常感谢您的耐心和对我的问题的任何建议。这是我用来输出 ggplot 的服务器函数,它可以独立工作,但在我更改输入时根本不会改变:
server <- function(input, output)
output$plooot<-renderPlot(
df = df %>%
group_by(input$Category,Type) %>%
summarise(Distribution=sum(Distribution))
ggplot(df,aes(input$Category,Distribution,fill=Type))+geom_bar(stat="identity",position="dodge"))
shinyApp(ui=ui,server=server)
这是我的 ui 函数,仅供参考:
ui <- fluidPage(
titlePanel("chart"),
# Generate a row with a sidebar
sidebarLayout(
# Define the sidebar with one input
sidebarPanel(
selectInput("Category","Category:",choices=c("a","b","c","d","e","f")),
selectInput("a","a:", choices=unique(Table$a), selected="All"),
selectInput("b","b:", choices=unique(Table$b), selected="All"),
selectInput("c","c:", choices=unique(Table$c), selected="All"),
selectInput("d","d:", choices=unique(Table$d), selected="All"),
selectInput("e","e:", choices=unique(Table$e), selected="All"),
selectInput("f","f:", choices=unique(Table$f), selected="All")
),
# Create a spot for the barplot
mainPanel(
plotOutput("plooot")
)
)
)
很遗憾,出于法律原因,我无法发布数据,但这里有两个图表,我想要什么与我拥有什么:
这可能是一个非常基本的错误,但我无法理解我做错了什么。
【问题讨论】:
group_by(input$Category,Type)
需要一个实际的列(使用 NSE),而不是 character
(这是从 input$Category
获得的)。寻找 dplyr
动词的标准评估版本。
供参考:dplyr.tidyverse.org/articles/programming.html
尝试ic <- enquo(input$Category)
,然后尝试... %>% group_by(!!ic,Type) ...
。
我不确定您如何在应用程序中存储数据 (df),但 df = df %>% ....
可能会在您生成绘图时覆盖您的数据,从而无法在输入后更新绘图。
mistersunnyd,因为您是新来的(嗯,不是新来的,但您在 SO 的时间还没有接受答案)......当您找到充分解决您问题的答案时,请"accept" it.
【参考方案1】:
我同意@AndS.,重新分配回df = ...
不太可能是您想要/需要的,但几乎肯定会不可逆转地减少您的数据。此外,input$Category
是 character
,而不是 group_by
所期望的 symbol
。试试这个:
library(shiny)
library(dplyr)
library(ggplot2)
ui <- fluidPage(
titlePanel("chart"),
# Generate a row with a sidebar
sidebarLayout(
# Define the sidebar with one input
sidebarPanel(
selectInput("Category","Category:",choices=colnames(mtcars))
),
# Create a spot for the barplot
mainPanel(
plotOutput("plooot")
)
)
)
server <- function(input, output)
output$plooot<-renderPlot(
req(input$Category)
icq <- sym(input$Category)
mtcars %>%
group_by(!!!icq, vs) %>%
summarise(disp=sum(disp)) %>%
ggplot(aes_string(input$Category, "disp", fill="vs")) +
geom_bar(stat="identity", position="dodge")
)
shinyApp(ui=ui,server=server)
【讨论】:
很好的例子。我认为aes_string()
(有点)已被弃用。如果我们将sym
包装在quo
中,我们也可以在ggplot2 中使用quosures。 icq <- quo(!!sym(input$Category))
然后调用 group_by(!!icq, vs)
和 ggplot(aes(!!icq, disp, fill=vs))
@AndS.,我是这么认为的,但我承认还没有完全“掌握”quosure
场景。感谢代码提示!【参考方案2】:
不知道您的数据是什么样的,请参见下文。对于将受用户输入影响的任何数据集,最好的做法是将其放入反应式表达式中。然后在输出图中使用该反应式表达式。我还在你的选择中添加了一个“ALL”和一个 if 函数,以防你想像在图片中一样看到它们。
ui <- fluidPage(
titlePanel("Chart"),
sidebarLayout(
sidebarPanel(
selectInput("Category","Category:",choices=c("All","a","b","c","d","e","f"))
),
mainPanel(
plotOutput("Plot")
)
)
)
server <- function(input, output)
Distribution <- c(1,2,3,4,1,2,3,5,2,4)
Category <- c("a","b","c","e","f","a","b","c","e","f")
Type <- c("Blue","Blue","Blue","Blue","Blue","Red","Red","Red","Red","Red")
df <- data.frame(Distribution ,Category,Type)
df_subset <- reactive(
if (input$Category == "All") df
elsedf[df$Category == input$Category,]
)
output$Plot <- renderPlot(
dat <- df_subset()
dat <- dat %>%
group_by(Category,Type) %>%
summarise(Distribution=sum(Distribution))
plot <- ggplot(dat,aes(Category,Distribution,fill=Type))+geom_bar(stat="identity",position="dodge")
return(plot)
)
shinyApp(ui=ui,server=server)
【讨论】:
以上是关于闪亮的情节不会随着输入而改变的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationBar 的标题不会随着 push segue 的转换而改变
Tensorflow val_sparse_categorical_accuracy 不会随着训练而改变