Есть ли способ связать пользовательский ввод (ось x, ось y, цвет и т. д.) с графиком gganimate в R Shiny? Таким образом, когда пользователь выбирает другой ввод (ось X, ось Y, цвет и т. д.) из раскрывающегося списка. График gganimate будет заполнен разными осями x, y, цветом и т. д., чтобы его можно было изменить соответствующим образом?
Кодирование, которое я пробовал, показано ниже. И есть ошибка из-за того, что имя переменной, которое я сохранил в пользовательском интерфейсе (xValue, yValue, colorValue и т. д., которые помещаются в функцию ggplot), не применяется в Serve...
Идея кода пользовательского интерфейса взята отсюда: https://shiny.rstudio.com/articles/layout-guide.html И это будет отображать что-то вроде этого:
library(shiny)
library(shinythemes)
library(palmerpenguins)
library(gganimate)
library(dplyr)
library(tidyr)
library(ggplot2)
library(gapminder)
data(package = 'palmerpenguins')
ui <- fluidPage(
navbarPage(
"Animated penguins data",
tabPanel("Navbar 2",
##########
imageOutput('plot'),
hr(),
fluidRow(
column(3,
h4("Diamonds Explorer"),
sliderInput('sampleSize', 'Sample Size',
min=1, max=nrow(penguins), value=min(1000, nrow(penguins)),
step=500, round=0),
br(),
checkboxInput('jitter', 'Jitter'),
checkboxInput('smooth', 'Smooth')
),
column(4, offset = 1,
xValue -> selectInput('x', 'X', names(penguins)),
yValue -> selectInput('y', 'Y', names(penguins), names(penguins)[[2]]),
colorValue -> selectInput('color', 'Color', c('None', names(penguins)))
),
column(4,
rowValue -> selectInput('facet_row', 'Facet Row', c(None='.', names(penguins))),
columnValue -> selectInput('facet_col', 'Facet Column', c(None='.', names(penguins)))
)
)
#########
),
) # navbarPage
) # fluidPage
Идея подачи пришла отсюда: Как создать и отобразить анимированный GIF в Shiny?
Сервер какой-то. как это
# Define server function
server <- function(input, output) {
##########################################
output$plot <- renderImage({
# A temp file to save the output.
# This file will be removed later by renderImage
outfile <- tempfile(fileext='.gif')
# now make the animation
p = myPenguins %>%
ggplot(
aes(xValue, yValue, color = colorValue)) +
geom_point() +
#geom_line() +
facet_grid(rows = vars(rowValue), cols = vars(columnValue))+
theme_bw()+
#theme_minimal() +
transition_time(year)+
labs(title = "Year: {frame_time}")+
view_follow()#+
anim_save("outfile.gif", animate(p)) # New
# Return a list containing the filename
list(src = "outfile.gif",
contentType = 'image/gif')
}, deleteFile = TRUE)
################################################################
}
shinyApp(ui = ui, server = server)
@Limey Спасибо. загружаю вопрос. Взглянуть. :)
Ваш код все еще далек от минимальный, и у меня не так много пакетов, на которые вы ссылаетесь, но я думаю, что следующее проиллюстрирует методы, которые позволят вам делать то, что вы хотите. Я основывал свой код на наборе данных diamonds
, который является частью ggplot2
.
Ваша проблема связана с тем, что виджеты ввода Shiny (обычно) возвращают строки, тогда как функции ggplot ожидают символы в качестве аргумента. Это особенность использования tidyverse нестандартной оценки (NSE).
В результате интерфейс между Shiny и tidyverse может вызвать недоумение, когда вы впервые сталкиваетесь с ним. Одним из решений является использование оператора взрыва (!!
) и функции sym
.
Следующее приложение отображает многогранную диаграмму рассеивания, на которой пользователь имеет полный контроль над переменными, которые
library(shiny)
library(tidyverse)
ui <- fluidPage(
selectInput("x", "X variable:", names(diamonds)),
selectInput("y", "Y variable", names(diamonds), selected="price"),
selectInput("colour", "Colour: ", names(diamonds), selected="color"),
selectInput("facetRows", "Facet rows: ", names(diamonds), selected="clarity"),
selectInput("facetCols", "Facet columns", names(diamonds), selected="cut"),
plotOutput("plot")
)
server <- function(input, output) {
output$plot <- renderPlot({
diamonds %>%
ggplot() +
geom_point(aes(x=!!sym(input$x), y=!!sym(input$y), colour=!!sym(input$colour))) +
facet_grid(rows=vars(!!sym(input$facetRows)), cols=vars(!!sym(input$facetCols)))
})
}
shinyApp(ui = ui, server = server)
Обратите внимание, что набор данных diamonds
довольно велик, и плохой выбор переменных для любой из пяти упомянутых выше ролей может привести к длительным задержкам!
Я считать, это дает ответ на ваш вопрос, но я не совсем уверен из-за множества разрозненных функций в вашем коде (например, сохранение файла GIF, использование gganimate
, ссылка на gapminder
), которые не кажутся относящимися к вопросу о использование входных данных пользовательского интерфейса при вызове renderPlot
. Если я не дал вам то, что вы хотите, пожалуйста, уточните свой вопрос и код, чтобы они ссылались только на элементы, которые имеют решающее значение для фундаментальной проблемы.
Эта почта поможет вам построить минимальный воспроизводимый пример.
Большое спасибо! Вот именно, что меня смущает! И я полностью согласен с тем, что вы сказали о проблеме выбора переменных. Не могли бы вы дать мне больше предложений о том, как ограничить выбор? Например. если переменные "числовая_переменная 1", "числовая_переменная 2", "категориальная_переменная 1", "категориальная_переменная 2". И только строки фасета являются "categorical_variable 1" или "categorical_variable 2". (Я знаю, как выбрать только одну переменную по selectInput("x", "X variable:", names(penguins)[[1]]
, но есть ли способ выбрать 2 из них?
Когда я пытаюсь запустить ваш код, я получаю сообщение об ошибке: Ошибка в nrow (пингвины): объект «пингвины» не найден. Также неясно ваше описание вашей проблемы: какая переменная, которую вы «определяете» в пользовательском интерфейсе, недоступна на сервере? Что вы хотите сделать с ним на сервере? Какое отношение Shinythemes имеет к проблеме? И т.д