У меня есть ряд похожих функций, которые все должны извлечь некоторые значения из фрейма данных.Примерно так:
foo_1 <- function(data, ...) {
x <- data$x
y <- data$y
# some preparatory code common to all foo_X functions
# .. do some boring stuff with x and y
# pack and process the result into 'ret'
return(ret)
}
Эти функции затем предоставляются в качестве аргументов для какой-либо другой функции (назовем ее «главной функцией». Я не могу изменить ведущую функцию).
ОднакоЯ хотел бы избежать переписывания одного и того же подготовительного кода в каждой из этих функций. Например, , я не хочу использовать data$x
вместо того, чтобы назначать его для x
и x
, потому что это делает скучные вещи трудными для чтения.В настоящее время мне нужно написать x <- data$x
(и т. Д.) Во всех функциях foo_1
, foo_2
....Что раздражает и загромождает код.Кроме того, упаковка и обработка являются общими для всех функций foo_N
.Другой подготовительный код включает в себя масштабирование переменных или регуляризацию идентификаторов.
Каким будет элегантный и лаконичный способ сделать это?
Одна из возможностей - attach()
фрейм данных (или использовать with()
, как предложил Хонг в ответе ниже), но я не знаю, какие другие переменные будут в моем пространстве имен: присоединение данных может маскировать другие переменные, которые я использую в fun_1
.Кроме того, предпочтительно, чтобы foo_N
функции вызывались с явными параметрами, чтобы было легче увидеть, что им нужно и что они делают.
Следующая возможность, о которой я думал, была конструкция, подобная этой:
foo_generator <- function(number) {
tocall <- switch(1=foo_1, 2=foo_2, 3=foo_3) # etc.
function(data, ...) {
x <- data$x
y <- data$y
tocall(x, y, ...)
# process and pack into ret
return(ret)
}
foo_1 <- function(x, y, ...) {
# do some boring stuff
}
Тогда я могу использовать foo_generator(1)
вместо foo_1
в качестве аргумента для главной функции.
Есть ли лучший или более элегантный способ?Я чувствую, что упускаю из виду нечто очевидное.