将变量作为参数传递给plot_ly函数

时间:2017-12-11 19:39:36

标签: r plotly

我想创建一个函数,根据传递给它的参数创建不同类型的绘图。如果我创建以下数据

library(plotly)
#### test data
lead <- rep("Fred Smith", 30)
lead <- append(lead, rep("Terry Jones", 30))
lead <- append(lead, rep("Henry Sarduci", 30))
proj_date <- seq(as.Date('2017-11-01'), as.Date('2017-11-30'), by = 'day')
proj_date <- append(proj_date, rep(proj_date, 2))
set.seed(1237)
actHrs <- runif(90, 1, 100)
cummActHrs <- cumsum(actHrs)
forHrs <- runif(90, 1, 100)
cummForHrs <- cumsum(forHrs)
df <- data.frame(Lead = lead, date_seq = proj_date,
                 cActHrs = cummActHrs,
                 cForHrs = cummForHrs)

我可以使用以下方式绘制它:

plot_ly(data = df, x = ~date_seq, y = ~cActHrs, split = ~Lead)

如果我制作了如下所示的 makePlot 功能,我该如何做到这样:

makePlot <- function(plot_data = df, x_var = date_seq, y_var, split_var) {
    plot <- plot_ly(data = df, x = ~x_var, y = ~y_var, split = ~split_var)

    return(plot)
}

是否有一个函数可以包装x_var,y_var和split_var,以便将它们识别为x,y和split参数?

1 个答案:

答案 0 :(得分:3)

最终解决了这个问题并希望这个小小的后续工作能够解决这些类型任务的一些谜团。虽然这个问题集中在绘图上,但重要的是首先要了解各种R包中的函数(例如dplyr和plotly)如何计算表达式以及如何操纵这些表达式的计算方式。构建这种理解的一个很好的参考是Hadley关于dplyr herehere编程的文章。

一旦掌握了这一点,事实证明这很容易。诀窍是简单地传递变量参数,就像调用dplyr函数时一样,并确保在绘图函数中引用这些参数。对于上面的问题,这个功能对我有用:

makePlot <- function(plot_data = df, x_var, y_var, split_var,
                     type_var="scatter",
                     mode_var="lines+markers") {
    quo_x <- enquo(x_var)
    quo_y <- enquo(y_var)
    quo_split <- enquo(split_var)

    # print(c(quo_x, quo_y, quo_split))

    plot <- plot_ly(data = df, x = quo_x, y = quo_y, split = quo_split,
                    type=type_var, mode=mode_var)

    return(plot)
}

# using df created in question, pass col's as args like dplyr functions
p1 <- makePlot2(df, date_seq, cActHrs, Lead)
p2 <- makePlot2(df, date_seq, cForHrs, Lead)