Применять функции и аргументы по построчной оценке - PullRequest
1 голос
/ 17 мая 2019

Я работаю над полуавтоматическим отчетом, который состоит из десятков различных графиков. Я создал таблицу 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)
})

1 Ответ

3 голосов
/ 17 мая 2019

Попробуйте это:

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)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...