#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 для наивных байесовских и других формул не распознаются.