如何在 R 中的通用函数中的 aes 中指定任意数量的变量?

How to specify an arbitrary amount of variables in aes in a generic function in R?

我正在制作一个闪亮的应用程序,用户可以在其中指定自变量,因此闪亮会显示带有 plotly 的时间序列图,其中 on-however 每个点都显示所选参数。

如果我知道用户选择的确切变量数,我就可以毫无问题地构建时间序列图。假设选择了 3 个参数:

ggp <- ggplot(data = data.depend(), aes(x = Datum, y = y, tmp1 = .data[[input$Coockpit.Dependencies.Undependables[1]]], tmp2 = .data[[input$Coockpit.Dependencies.Undependables[2]]], tmp3 = .data[[input$Coockpit.Dependencies.Undependables[3]]])) + 
     geom_point()
ggplotly(ggp)

其中 data.depend() 看起来像

并且所选参数存储在字符向量中

所以问题是对于我想包含在工具提示中的每个参数,我必须在 aes 函数中将其硬编码为 tmpi = .data[[input$Coockpit.Dependencies.Undependables[i]]] .但是,我想编写处理任意数量的选定参数的通用函数。欢迎任何评论建议。

编辑: 下面是一个最小的工作示例:

data.dummy <- data.frame(Charge = c(1,2,3,4,5), Datum = c(as.Date("2020-01-01"),as.Date("2020-01-02"),as.Date("2020-01-03"),as.Date("2020-01-04"),as.Date("2020-01-05")), y = c(4,5,6,4,5), ZuluftTemperatur = c(52,51,54,58,49), Durchflussgeschwindigkeit = c(690, 716,722,710,801), ZuluftFeuchtigkeit= c(3.9,4.1,3.8,3.0,4.9))
ChosenParams <- c("ZuluftTemperatur", "ZuluftFeuchtigkeit", "Durchflussgeschwindigkeit")
ggp <- ggplot(data = data.dummy, aes(x = Datum, y = y,  tmp1 = .data[[ChosenParams[1]]], tmp2 = .data[[ChosenParams[2]]], tmp3 = .data[[ChosenParams[3]]])) + geom_point()
ggplotly(ggp)

结果:

所以这是以我知道用户正在选择三个参数的“成本”为代价的,因此我写了 aes tmpi = .data[[ChosenParams[i]]];我=1:3。我对具有相同结果但不必编写的解决方案感兴趣 tmpi = .data[[ChosenParams[i]]] i-number of times

谢谢!

一种解决方案是使用 eval(parse(...)) 为您创建代码:

library(ggplot2)
library(plotly)

data.dummy <- data.frame(Charge = c(1,2,3,4,5), Datum = c(as.Date("2020-01-01"),as.Date("2020-01-02"),as.Date("2020-01-03"),as.Date("2020-01-04"),as.Date("2020-01-05")), y = c(4,5,6,4,5), ZuluftTemperatur = c(52,51,54,58,49), Durchflussgeschwindigkeit = c(690, 716,722,710,801), ZuluftFeuchtigkeit= c(3.9,4.1,3.8,3.0,4.9))
ChosenParams <- c("ZuluftTemperatur", "ZuluftFeuchtigkeit", "Durchflussgeschwindigkeit")

ggp <- eval(parse(text = paste0("ggplot(data = data.dummy, aes(x = Datum, y = y, ",
                                paste0("tmp", seq_along(ChosenParams), " = .data[[ChosenParams[", seq_along(ChosenParams), "]]]", collapse = ", "),
                                ")) + geom_point()"
                                )
                  ))

            
ggplotly(ggp)

请注意,这不是很有效,在某些情况下不建议使用它(参见 What specifically are the dangers of eval(parse(...))?)。在aes()中可能还有一种使用准引号的方法,但我不太熟悉它。

编辑:添加了一种使用准引用的方法。

我仔细查看了 aes() 中的准引号,发现使用 syms()!!!:

的更好方法
data.dummy <- data.frame(Charge = c(1,2,3,4,5), Datum = c(as.Date("2020-01-01"),as.Date("2020-01-02"),as.Date("2020-01-03"),as.Date("2020-01-04"),as.Date("2020-01-05")), y = c(4,5,6,4,5), ZuluftTemperatur = c(52,51,54,58,49), Durchflussgeschwindigkeit = c(690, 716,722,710,801), ZuluftFeuchtigkeit= c(3.9,4.1,3.8,3.0,4.9))
ChosenParams <- c("ZuluftTemperatur", "ZuluftFeuchtigkeit", "Durchflussgeschwindigkeit")
names(ChosenParams) <- paste0("tmp", seq_along(ChosenParams))
ChosenParams <- syms(ChosenParams)

ggp <- ggplot(data = data.dummy, aes(x = Datum, y = y, !!!ChosenParams)) + geom_point()
ggplotly(ggp)