R 将变量作为参数传递给plot_y函数

R 将变量作为参数传递给plot_y函数,r,plotly,R,Plotly,我想创建一个函数,根据传入的参数创建不同类型的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.

我想创建一个函数,根据传入的参数创建不同类型的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)
如果我制作了如下所示的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)
}

makePlot最终找到了答案,希望这一小部分后续工作能够揭开这些任务的神秘面纱。尽管这个问题的重点是绘图,但首先要了解各种R包(例如dplyr和plotly)中的函数如何计算表达式,以及如何操作这些表达式的计算方式,这一点很重要。Hadley关于用dplyr或其他语言编程的文章是建立这种理解的一个很好的参考

一旦你做到了,这就很容易了。诀窍是像调用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 = plot_data, 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)
makePlot
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 = plot_data, 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)