【问题标题】:R shiny error when using reactive to plot使用响应式绘图时出现 R 闪亮错误
【发布时间】:2020-03-10 20:22:16
【问题描述】:

我有这个数据集:

Area <- c("Mexico", "USA", "USA", "Canada").

Type_of_participants <- c("Doctor", "Doctor", "Engineer", "Dancer".

Salary <- c("4000", "6000", "8000", "5000").

我正在尝试根据 Area(level1) 和 Type_of_participants(level2) 的用户输入绘制工资基数,但没有出现任何内容。当我在这里查找时,我将 aes 修改为 aes_string。请帮我找出错误

我的代码

`ui <- fluidPage(
   titlePanel("Survey Results"),
   sidebarLayout(
   sidebarPanel(strong("Overview Plot"),
             br(),
             ###1a.Area input
             selectInput("selection","Var",
                          choices = c("Area","Type_of_participants"),
                          selected = "Area"),
            uiOutput("choice_selection")      
),
mainPanel(    
  plotOutput("Overview"))

`server <- function(input, output) {
   output$choice_selection <- renderUI({
   checkboxGroupInput("baseinput","Detail",
                   unique(df[,input$selection])
                  )`
   })
    dt1 <- reactive({
   df %>%
    group_by(input$selection,Type) %>%
     filter (input$selection %in% input$baseinput) %>%
     summarise(avg_salary_by_area = mean(Salary, na.rm = TRUE)) %>%
     select(input$selection, Type, avg_Salary_by_area)
      })

    output$Overview <- renderPlot({
    ggplot(data= dt1())+
     aes(fill = Type)+
      geom_bar(x=input$selection, y = avg_salary_by_area,stat="identity", 
           position = position_dodge())

结果是我可以选择输入但无法可视化绘图。错误“未知列区域或未知参与者类型

请帮我找出错误

谢谢

***更新

感谢弗利克先生,我已经修复了我的代码,但它仍然提示错误“找不到对象区域”。请帮忙指教。非常感谢

  `dt1 <- reactive({
  df[df[,input$selection] %in% input$baseinput,] %>%
  group_by(input$selection,Type) %>%
  summarise(avg_score_by_area = mean(Score, na.rm = TRUE))
  })

 output$Overview <- renderPlot({

 ggplot(data= dt1(),aes_string(x= input$selection, 
                              y = "avg_score_by_area",fill = "Type"))+
 geom_bar(stat="identity", 
           position = position_dodge())`

【问题讨论】:

标签: r plot reactive


【解决方案1】:

@Suzie - 如上所述,如果您使用当前拥有的完整代码编辑问题会有所帮助。

一些有用的东西:

  • 薪水在您的df 中应该是数字(或者在尝试取平均值之前使用as.numeric 进行转换
  • 您的reactive 表达式可以使用!!as.symbolinput$selection 来过滤来自df 的字符串名称
  • 绘图可以使用aes_string 作为变量名。

编辑

对于!!as.symbol的进一步解释,首先考虑input$selection的结果是什么。如果您在闪亮的代码中使用browser(),并检查input$selection 返回的内容,您会看到类似"Area" 的内容(它返回一个字符串)。但是字符串不适合您的filter - 它需要一个代表数据框中列的符号。 (符号是对象的名称,如dfmtcars 等)

首先,您要将字符串转换为符号。您可以使用as.symbol()rlang::sym() 来做到这一点。您可以在控制台中尝试一下。如果您执行as.symbol("df"),它将返回符号df。如果您输入了eval(as.symbol("df")),它将与输入df 本身相同(它会显示您的数据框的内容)。

另一个问题是tidyverse 函数在特殊上下文中评估代码表达式(例如,在数据框中搜索名称)。在这种情况下,dplyr 知道名称 Area 位于 df(列名称之一)的上下文中。这是一个复杂的因素,因为引用了参数。要解决此问题,您需要使用 bang-bang !! 运算符取消引用(将名称替换为其值)。

将两者放在一起你会得到!!as.symbol()

值得注意的是,varSelectInputselectInput 的一种较新的闪亮替代品,可以考虑在此类情况下使用。

更多信息:

shinymeta special topics

advanced R

library(tidyverse)
library(shiny)

Area <- c("Mexico", "USA", "USA", "Canada")
Type_of_participants <- c("Doctor", "Doctor", "Engineer", "Dancer")
Salary <- c(4000, 6000, 8000, 5000)

df <- data.frame(Area, Type_of_participants, Salary)

ui <- fluidPage(
  titlePanel("Survey Results"),
  sidebarLayout(
    sidebarPanel(strong("Overview Plot"),
                 br(),
                 ###1a.Area input
                 selectInput("selection","Var",
                             choices = c("Area","Type_of_participants"),
                             selected = "Area"),
                 uiOutput("choice_selection")      
    ),
    mainPanel(    
      plotOutput("Overview")
    )
  )
)

server <- function(input, output) {

  output$choice_selection <- renderUI({
    checkboxGroupInput("baseinput", "Detail", unique(df[,input$selection]))
  })

  dt1 <- reactive({
    df %>%
      group_by(Area, Type_of_participants) %>%
      filter(!!as.symbol(input$selection) %in% input$baseinput) %>%
      summarise(avg_salary_by_area = mean(Salary, na.rm = TRUE))
  })

  output$Overview <- renderPlot({
    ggplot(data = dt1(), aes_string(x = input$selection, y = "avg_salary_by_area", fill = "Type_of_participants")) +
      geom_bar(stat="identity", position = position_dodge())
  })
}

shinyApp(ui, server)

【讨论】:

  • 非常感谢您的帮助。您能否在这里解释一下语法 !!as.symbol(input$selection) 的更多信息,因为我对此仍然有些困惑,并且互联网上没有太多关于它的文档:( 欣赏它:)
  • @Suzie 查看编辑后的答案以获得更多解释。
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2019-05-20
  • 2017-11-16
  • 2020-04-14
  • 1970-01-01
相关资源
最近更新 更多