R使用反应式绘图时出现错误

R使用反应式绘图时出现错误,r,plot,reactive,R,Plot,Reactive,我有以下数据集: Area <- c("Mexico", "USA", "USA", "Canada"). Type_of_participants <- c("Doctor", "Doctor", "Engineer", "Dancer". Salary <- c("4000", "6000", "8000", "5000"). Area@Suzie-如上所述,如果您使用当前的完整代码编辑您的问题,将会有所帮助 以下几点会有所帮助: 工资应该是你的df中的数字(或者在

我有以下数据集:

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

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

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

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

以下几点会有所帮助:

  • 工资应该是你的
    df
    中的数字(或者在尝试取平均值之前用
    转换为.numeric
  • 您的
    reactive
    表达式可以使用
    !!as.symbol
    input$selection
    df
  • 绘图可以使用
    aes\u字符串
    作为变量名
编辑

<>为进一步解释<代码>!!AS符号<代码>,首先考虑<代码>输入$选择> <代码>的结果。如果在代码中使用<代码>浏览器()/<代码>,并检查“<代码>输入$选择> /代码>返回,您将看到类似“代码>区域”< /COD>(它返回字符串)。。但是字符串在
过滤器中不合适
-它需要一个表示数据帧中列的符号。(符号是对象的名称,如
df
mtcars
,等等)

首先,您想将字符串转换为符号。您可以使用
as.symbol()
rlang::sym()
。您可以在控制台中尝试。如果您使用
as.symbol(“df”)
它将返回符号
df
。如果您输入
eval(as.symbol(“df”))
这与只需输入
df
本身相同(它将显示数据帧的内容)

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

将两者结合在一起可以得到
!!as.symbol()

值得注意的是,
varSelectInput
selectInput
的一个新的替代品,可以考虑在类似情况下使用

有关更多信息:

库(tidyverse)
图书馆(闪亮)

区域您的服务器功能似乎不完整。这可能会有所帮助:另外,您好,非常感谢您的帮助。我尝试按以下方式修改代码。仍然存在错误“未找到对象“区域”。请建议dt1%group_by(input$selection,Type)%%>%SUMMARASE(平均工资\u按区域=平均值(分数,na.rm=TRUE)))输出$Overview Hi@Suzie-请不要在评论中发布代码。相反,请编辑问题以反映其新状态非常感谢您的帮助。你能再解释一下语法吗!!as.symbol(输入$selection)在这里,因为我对此仍然有点困惑,而且互联网上关于它的文档也不多:(感谢:)@Suzie请参阅编辑后的答案以获取更多解释。
`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())`
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)