首页 > 解决方案 > 通过逐行评估应用函数和参数

问题描述

我正在编写一份半自动报告,其中包含几十个不同的图。我创建了一个 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)
})

标签: r

解决方案


试试这个:

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)
})

推荐阅读