Изменяет ли aes_string() какие-либо настройки по умолчанию в R? Проблема с вводом R Shiny и ggplot $ взаимодействие

#r #ggplot2 #shiny #aes

#r #ggplot2 #shiny #aes

Вопрос:

Я создаю приложение Shiny в Rstudio, и у меня возникли проблемы с вставкой ввода $char в ggplot boxplot, где ввод $char был переменной для оси y, а ось x была не входной переменной, а вместо этого из фрейма данных. Проблема заключалась в том, что данные не отображались на графике, но функция ввода выпадающего меню все равно изменила ось y на графике при загрузке приложения. Пример кода:

 g = reactive({ggplot(data=iris, aes(x=Species, y=input$ybox))  theme(legend.position = "top")})
output$Boxplot = renderPlot(g()   geom_boxplot(aes(fill=Species))   scale_fill_brewer(palette 
  = "Set2"))

  

В другом сообщении здесь я обнаружил, что aes_string() может решить проблему, и это произошло. Там, где aes находится в ggplot, я исправил ошибку с помощью aes_string() и пусть x=»Species» в функции….

за исключением того, что теперь все мои другие переменные не распознаются в остальной части моего приложения shiny! Там, где когда-либо есть Species или другая входная переменная $ char, они не распознаются, и я получаю сообщение об ошибке. Либо объект ‘Species’ не найден, либо неиспользуемые аргументы ‘вводят $char;,…,’Species’.

Пример кода, который выдает ошибку:

   selection = reactive({iris[, aes(c(input$xcol, input$ycol, 'Species'))]}) 
  fit = reactive({knn3(Species ~ ., data=selection(), k = input$K)}) 
  output$KNNplot = renderPlot({decisionplot(fit(), selection(), class=Species,main=paste('Decision Boundary for KNN (',input$K,')', sep=' '))})
  
  

Есть ли какой-либо способ, которым я могу найти решение для ошибки ggplot и для того, чтобы остальная часть моего приложения продолжала работать?

Редактировать (воспроизводимый код):

 library(shiny)
library(shinyWidgets)
library(lattice)
library(ggplot2)
library(RColorBrewer)
library(nnet)
library(naivebayes)
library(e1071)
library(randomForest)
library(MASS)

# function for decisionplot.R
decisionplot <- function(model, data, class = NULL, predict_type = "class",
                         resolution = 100, showgrid = TRUE, ...) {
  
  if(!is.null(class)) cl <- data[,class] else cl <- 1
  data <- data[,1:2]
  k <- length(unique(cl))
  
  plot(data, col = as.integer(cl) 1L, pch = as.integer(cl) 1L, ...)
  
  # make grid
  r <- sapply(data, range, na.rm = TRUE)
  xs <- seq(r[1,1], r[2,1], length.out = resolution)
  ys <- seq(r[1,2], r[2,2], length.out = resolution)
  g <- cbind(rep(xs, each=resolution), rep(ys, time = resolution))
  colnames(g) <- colnames(r)
  g <- as.data.frame(g)
  
  ### guess how to get class labels from predict
  ### (unfortunately not very consistent between models)
  p <- predict(model, g, type = predict_type)
  if(is.list(p)) p <- p$class
  p <- as.factor(p)
  
  if(showgrid) points(g, col = as.integer(p) 1L, pch = ".")
  
  z <- matrix(as.integer(p), nrow = resolution, byrow = TRUE)
  contour(xs, ys, z, add = TRUE, drawlabels = FALSE,
          lwd = 2, levels = (1:(k-1)) .5)
  
  invisible(z)
}

ui = fluidPage(
  navlistPanel(
    tabPanel("Descriptive Statistics",
             fluidRow(
               column(6,
                      wellPanel(selectInput('ybox', 'Y Variable', names(iris)[1:4], selected = names(iris)[[2]])),
                      plotOutput('Boxplot'))),
              fluidRow(
               column(12, 
                      wellPanel(selectInput('xdens', 'X Variable', names(iris)[1:4], selected= names(iris)[2])),
                      plotOutput("Densplot")))),
    tabPanel("Naive Bayes Classifier",
           wellPanel(selectInput('xcol5', 'X Variable', names(iris)[1:4], selected = names(iris)[[1]]),
                     selectInput('ycol5', 'Y Variable', names(iris)[1:4], selected = names(iris)[[2]])),
           plotOutput('NBplot'))
  
    ))

server = function(input, output) {
   
  # Boxplot
  g = reactive({ggplot(data=iris, aes_(x='Species', y=iris[[as.name(input$ybox)]]))  theme(legend.position = "top")})
  output$Boxplot = renderPlot(g()   geom_boxplot(aes(fill=Species))   scale_fill_brewer(palette = "Set2")   ylab(input$ybox))
  
  
  # Densityplot
  c = reactive({ggplot(iris, aes_(iris[[as.name(input$xdens)]]))})
  mu = reactive({ddply(iris, "Species", summarise, grp.mean=mean(c()))})
  dc = reactive({c()   geom_density(kernel="gaussian", aes(color=Species, fill=Species), alpha=0.4)  
      geom_vline(data=mu(), aes(xintercept=mu()$grp.mean, color=Species),linetype="dashed")  
      theme(legend.position = "top")   xlab(input$xdens)})
  output$Densplot = renderPlot({dc()   scale_color_brewer(palette="Dark2")   scale_fill_brewer(palette = "Dark2")})
  
  
  #example model
  selection5 = reactive({iris[, c(input$xcol5, input$ycol5, 'Species')]}) 
  fit5 = reactive({naive_bayes(Species ~ ., data=selection5(), usekernel = T)})
  output$NBplot = renderPlot({decisionplot(fit5(), selection5(), class = "Species",
                                           main = "Decision Boundary for Naive Bayes Classifier")})
  
  
}

shinyApp(ui = ui, server = server)
  

Комментарии:

1. ggplot(data=iris, aes(x=Species, y= .data[[input$ybox]])

Ответ №1:

Ваша selection5 проблема. Следующий код выдает реактивный фрейм данных.

   #example model
  selection5 <- reactive({
    # df <- iris[, c(input$xcol5, input$ycol5, 'Species')] ## this call does not work
    df <- data.frame(x=iris[[input$xcol5]], y=iris[[input$ycol5]], Species=iris[, "Species"])
  }) 
  
  

Комментарии:

1. Хорошо, но при этом мне пришлось изменить остальную часть моего графика, чтобы он распознавал виды и отображал график. Например, мне пришлось изменить fill=Species на fill=iris[[‘Species’]] . И остальные мои модели, такие как график KNN, по-прежнему не распознают входные $ или Species, когда они использовались до того, как я добавил эти элементы ggplot в свое приложение.

2. Спасибо, но я думаю, что большая часть моей проблемы заключается в понимании того, почему добавление aes_string() и этих ggplots в основном сломало мое приложение и сделало все ранее распознаваемые входные данные более не распознаваемыми для остальных моих функций: (

3. aes_string() использует стандартную оценку — aes_string(x = "mpg", y = "wt") , в то время aes() как использует нестандартную оценку — aes(x = mpg, y = wt) . Вы также можете попробовать aes_() , так как в некоторых ситуациях это работает лучше.

4. Да! Это немного помогло, спасибо. В ggplot я использовал aes_(x = ‘Species’, y= iris[[as.name (введите $ybox)]]), а затем в geom_boxplot я использовал aes(fill=Species). Однако мой график KNN (как и другие) по-прежнему выдает ошибку «ввод неиспользуемых аргументов $, …,’Species'». Я снял кавычки для видов, и он сказал, что объект не найден. Я добавил iris[[as.name ()]] к входным данным, и это тоже породило ошибку неиспользуемых аргументов. Вы знаете, как я мог бы это исправить?

5. Хорошо, я добавил некоторый код для создания проблемы. Я выделил проблему для графика плотности. Если я закомментирую это из кода, все мои графики будут работать, но при этом входные $ s и Species для наивных байесовских и других формул не распознаются.