«Отсутствует значение там, где требуется TRUE / FALSE» при запуске приложения R Shiny - PullRequest
1 голос
/ 13 марта 2020

Я новичок в создании приложений R Shiny. До сих пор я делаю часть своего приложения, в которой я пытаюсь генерировать различные графики в зависимости от того, какая переменная выбрана для анализа. Я буду использовать встроенный набор данных iris в качестве примера.

library(shiny)
library(tidyverse)

ui <- fluidPage(
  titlePanel("Title"),
  sidebarLayout(
    sidebarPanel("Create plots of mean variables by species. ",
            varSelectInput("vars", h5("Choose a variable to display."),
                data = iris,
                selected = "Sepal.Length"),
                sliderInput("toprange", h5("Display Number of Species"),
                            min = 1, max = 3, value = 3)), 
                            #in my actual dataset there are more than 30 different levels.
    mainPanel(plotOutput("bars"))

  )
)

server <- function(input, output) {
  output$bars <- renderPlot({

    species_plot(input$vars, input$toprange)

  })
}

shinyApp(ui = ui, server = server)

Вот функция, используемая для создания графиков:

species_plot <- function(variable, min) {
iris %>%
  group_by(Species) %>%
  filter(Species != "") %>% 
  summarize(avg = mean({{variable}})) %>% 
  top_n(avg, min) %>%
  ggplot(aes(x = reorder(Species, avg), y = avg)) +
  geom_col() +
  labs(x = "Species", y = paste("Mean", toString(sym(variable)))) +
  ggtitle(paste("Mean", toString(sym(variable)), "by Species")) +
  coord_flip()
}

Когда я запускаю приложение, все на боковой панели показывает, но на главной панели появляется сообщение об ошибке «отсутствует значение, где требуется ИСТИНА / ЛОЖЬ», и я не уверен, откуда это вытекает. Например, я не вижу условного выражения, которое бы вывело эту ошибку.

1 Ответ

0 голосов
/ 13 марта 2020

Проблема в функции печати, а не в коде shiny. Подход, который вы используете для передачи имени переменной в кавычках filter, не работает. См. этот Q & A для того, который делает. В вашей функции это выглядит как ...

species_plot <- function(variable, min) {
iris %>%
  group_by(Species) %>%
  filter(Species != "") %>% 
  summarize(avg = mean(!!sym(variable))) %>% 
  top_n(avg, min) %>%
  ggplot(aes(x = reorder(Species, avg), y = avg)) +
  geom_col() +
  labs(x = "Species", y = paste("Mean", variable)) +
  ggtitle(paste("Mean", variable, "by Species")) +
  coord_flip()
}

Обратите внимание, что это также означает, что вам не понадобятся все эти toString(sym(variable)) вещи позже в функции. Это уже строка, так что просто передайте variable.

В качестве примечания, я думаю, что top_n тоже не делает то, что вы думаете, делает в этой функции. После запуска summarize каждая группа имеет только одно значение, поэтому top_n выдает сообщение об ошибке. Функция работает в любом случае, потому что она просто игнорирует этот нелогичный вызов и движется дальше. Но что бы вы там ни пытались делать, вам нужно будет действовать по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...