Я работаю над полуавтоматическим отчетом, который состоит из десятков различных графиков. Я создал таблицу excel / csv для управления содержимым отчета, в котором перечислены по очереди различные элементы данных, которые должны быть нанесены на график, с такими аргументами, как заголовки и т. Д. В столбцах. Я создал пользовательские функции для каждого типа графика, и они отлично работают.
Там, где я остановился, находится функция верхнего уровня, которая будет проходить через строку данных, принимать идентификатор функции, применять соответствующую функцию и принимать значения из других столбцов строки в качестве аргументов.
Упрощенный пример:
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
в качестве аргументов для этой функции.
Есть идеи? Заранее спасибо!
UPDATE:
Я адаптировал решение Майкла Скотта почти к копированию / вставке и в итоге получил:
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)
})