Функция dplyr group_by в блестящем

У меня проблемы с получением group_by в работе dplyr при использовании Shiny. Кажется, что dplyr не распознает входную переменную $ var из Shiny как допустимое поле в таблице.

В этом примере я хочу, чтобы вход "level" в ui.R определял, что группировать.

В ui.RI есть:

library(shiny)
shinyUI(fluidPage(
titlePanel("Orders"),
sidebarLayout(
sidebarPanel(
  selectInput("Region_Input", label = h5("Choose a Region"), 
              choices = list("A", "B")),
  radioButtons("level", "What level do you want to see:",
                     list("item", "category"))

),
mainPanel(
  verbatimTextOutput("Level_Select"),
  tableOutput(outputId="table")

))))

В server.RI есть:

library(shiny)  
library(dplyr)

OrderItems <- data.frame(Region =      c('A','A','A','A','A','A','B','B','B','B','B','B','B'),
                     item = c('Item A','Item B','Item C','Item D','Item E',
                              'Item A','Item B','Item C','Item D','Item E',
                              'Item A','Item B','Item C'),
                     category = c('Cat 1','Cat 1','Cat 1','Cat 2','Cat 2',
                                  'Cat 1','Cat 1','Cat 1','Cat 2','Cat 2',
                                  'Cat 1','Cat 1','Cat 1'))
shinyServer(
function(input, output) {

output$table <- renderTable({
  OrderItems %>%
    group_by(input$level) %>%
    summarize(count = n()) %>%
    arrange(desc(count))    
})
})

Результат, который я ожидаю, когда вход "уровень" равен "категория":

   category count
1   Cat 1   9
2   Cat 2   4

Тем не менее, в итоге я получаю:

    input$level count
1   category           13

Любые идеи о том, как это исправить, с благодарностью!

2 ответа

Решение

Согласно комментарию @joran, это должно быть так же просто, как заменить group_by(input$level) с group_by_(input$level)Трудно сказать без воспроизводимого примера. Если вы сделаете несколько изменений и использовать mtcars данные, можно воспроизвести следующее, чтобы увидеть, как это работает:

server.R

library(shiny)  
library(dplyr)

shinyServer(
  function(input, output) {

    output$table <- renderTable({
      mtcars %>%
        group_by_(input$level) %>%
        summarize(count = n()) %>%
        arrange(desc(count))    
    })
  })

ui.R

library(shiny)
shinyUI(fluidPage(
  titlePanel("Orders"),
  sidebarLayout(
    sidebarPanel(
      selectInput("Region_Input", label = h5("Choose a Region"), 
                  choices = list("A", "B")),
      radioButtons("level", "What level do you want to see:",
                   list("cyl", "am"))

    ),
    mainPanel(
      verbatimTextOutput("Level_Select"),
      tableOutput(outputId="table")

    ))))

Для последней версии dplyr вы можете использовать:

      group_by(across(input$level))
Другие вопросы по тегам