闪亮的情节不会随着输入而改变

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 &lt;- enquo(input$Category),然后尝试... %&gt;% group_by(!!ic,Type) ... 我不确定您如何在应用程序中存储数据 (df),但 df = df %&gt;% .... 可能会在您生成绘图时覆盖您的数据,从而无法在输入后更新绘图。 mistersunnyd,因为您是新来的(嗯,不是新来的,但您在 SO 的时间还没有接受答案)......当您找到充分解决您问题的答案时,请"accept" it. 【参考方案1】:

我同意@AndS.,重新分配回df = ... 不太可能是您想要/需要的,但几乎肯定会不可逆转地减少您的数据。此外,input$Categorycharacter,而不是 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 &lt;- 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 不会随着训练而改变

iOS:尺寸等级不会因不同尺寸而改变

CSS的盒子模型,怎么才能让盒子不会随着浏览器窗口的变化而移动或者改变大小

如何让 UIPageControl 的背景颜色随着页面滑动而改变?