我有一个 R Shiny 应用程序,它根据用户选择的 x 变量绘制数据集horsepower。mtcars我希望用户能够在绘图之前选择对 x 变量执行的转换。在下面的简化示例中,这些变换是能够对其求平方或获得其倒数的能力。我正在使用开关功能来执行此操作。
虽然这个切换函数在非闪亮的上下文中工作,但我无法让它在工作的闪亮应用程序中执行。我知道我可以对数据框的反应式副本执行转换并从中进行绘图,但如果可能的话,我想在 ggplot 调用本身中执行转换。有人对如何做到这一点有任何建议吗?
library(shiny)
library(tidyverse)
tran_func <- function(pred, trans) {
switch(trans,
"None" = pred,
"Reciprocal" = 1/pred,
"Squared" = pred^2,
)
}
ui <- fluidPage(
selectInput("xvar",
"Select X Variable",
choices = names(mtcars),
selected = "disp"),
selectInput("transform",
"Select Transformation",
choices = c("None", "Reciprocal", "Squared"),
selected = "None"),
plotOutput("scatter_good"),
plotOutput("scatter_bad")
)
server <- function(input, output, session) {
output$scatter_good <- renderPlot({
mtcars %>%
ggplot(aes_string(x = "hp", y = input$xvar)) +
geom_point()
})
output$scatter_bad <- renderPlot({
mtcars %>%
ggplot(aes_string(x = "hp", y = tran_func(input$xvar, "Squared"))) +
geom_point()
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
问题是对传递来input$xvar修改列的字符串进行评估。一个选项是将“数据”也作为函数中的参数传递,并用于[[对列进行子集化,而不转换为符号或求值
library(shiny)
library(ggplot2)
library(dplyr)
tran_func <- function(data, pred, trans) {
switch(trans,
"None" = data[[pred]],
"Reciprocal" = 1/data[[pred]],
"Squared" = data[[pred]]^2,
)
}
ui <- fluidPage(
selectInput("xvar",
"Select X Variable",
choices = names(mtcars),
selected = "disp"),
selectInput("transform",
"Select Transformation",
choices = c("None", "Reciprocal", "Squared"),
selected = "None"),
plotOutput("scatter_good"),
plotOutput("scatter_bad")
)
server <- function(input, output, session) {
output$scatter_good <- renderPlot({
mtcars %>%
mutate(y_col = tran_func(cur_data(), input$xvar, input$transform)) %>%
ggplot(aes(x = hp, y = y_col)) +
geom_point()
})
output$scatter_bad <- renderPlot({
mtcars %>%
mutate(y_col = tran_func(cur_data(), input$xvar, input$transform)) %>%
ggplot(aes(x = hp, y =y_col)) +
geom_point()
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
-输出