使用switch从ggplot2函数内部转换变量

问题描述

我有一个R Shiny应用程序,它根据用户选择的x变量绘制了QObject数据集中的horsepower。我希望用户能够在绘图之前选择对x变量执行的变换。在下面的简化示例中,这些变换是使它平方或获得其倒数的能力。我正在使用开关功能来做到这一点。

尽管此切换功能可在非发光环境中使用,但我无法使其在正常运行的发光应用中执行。我知道我可以在数据帧的响应副本上执行转换并从中进行绘制,但是如果可能的话,我想在ggplot调用本身中执行转换。有人对此有任何建议吗?

mtcars

解决方法

问题将是评估从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(),y =y_col)) +
      geom_point()
  })
  
}

shinyApp(ui,server)

-输出

enter image description here