r - 通过逐行评估应用函数和参数
问题描述
我正在编写一份半自动报告,其中包含几十个不同的图。我创建了一个 excel/csv 表来管理报告的内容,该表按行列出要绘制的各种数据项,并在列中包含标题等参数。我为每种绘图类型创建了自定义函数,它们工作正常。
我陷入停顿的地方是那种顶级函数,它将逐行遍历数据框,获取函数 id,应用相应的函数并将行的其他列中的值作为参数。
一个简化的例子如下
dat <- data.frame(data_item=seq(1:5), function_id=c(1,2,3,2,3),
x=sample(1:5,5), y=sample(1:5,5))
产生一个数据框:
data_item function_id x y
1 1 1 5 2
2 2 2 4 4
3 3 3 1 3
4 4 2 2 5
5 5 3 3 1
然后我有绘图功能,比如:
fun1 <- function(df, data_item, x,y){ggplot(df %>% dplyr::filter(data_item == !!data_item),aes(x,y))+geom_point(col = "red")}
fun2 <- function(df, data_item, x,y){ggplot(df %>% dplyr::filter(data_item == !!data_item),aes(x,y))+geom_point(col = "blue")}
fun3 <- function(df, data_item, x,y){ggplot(df %>% dplyr::filter(data_item == !!data_item),aes(x,y))+geom_point(col = "green")}
我需要dat
逐行评估数据框并应用fun1
是否function_id
等于 1,fun2
如果等于 2,依此类推,并data_item, x, y
作为该函数的参数。
有任何想法吗?提前致谢!
更新:我改编了迈克尔斯科特的解决方案,几乎复制/粘贴并最终得到:
apply(test1,1,function(row){
item <- row[1]
rank_order <- row[2]
graph_type <- row[3]
plot_title <- row[4]
sub_title <- row[5]
x_axis_title <- row[6]
y_axis_title <- row[7]
caption <- row[8]
data_set <- row[9]
weight_basis <- row[10]
funcs[[graph_type]](test1,item,rank_order,plot_title,sub_title,x_axis_title,y_axis_title,caption,data_set,weight_basis)
})
解决方案
试试这个:
funcs <- list(fun1,fun2,fun3)
apply(dat,1,function(row){
data_item <- row[1]
function_id <- row[2]
x <- row[3]
y <- row[4]
funcs[[function_id]](dat,data_item,x,y)
})