我正在处理一个半自动化的报告,该报告由数十个不同的地块组成。我创建了一个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
等于1,则应用function_id
,如果等于2,则应用fun2
,依此类推,依次类推,{{1} }作为该函数的参数。
有什么想法吗?预先感谢!
更新: 我改编了Michael Scott的解决方案,几乎将其复制/粘贴,最后得到:
data_item, x, y
答案 0 :(得分:3)
尝试一下:
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)
})