Я пытаюсь написать функцию для приема data.frame(x
) и column
. Функция выполняет некоторые вычисления по x, а затем возвращает другой data.frame. Я привязался к методу лучших практик, чтобы передать имя столбца функции.
Два минимальных примера fun1
и fun2
ниже приводят желаемый результат, позволяя выполнять операции с x$column
, используя max()
в качестве примера. Однако оба полагаются на, казалось бы, (по крайней мере, на меня) inelegant
- вызов
substitute()
и, возможно,eval()
- необходимо передать имя столбца в виде символьного вектора.
fun1 <- function(x, column){
do.call("max", list(substitute(x[a], list(a = column))))
}
fun2 <- function(x, column){
max(eval((substitute(x[a], list(a = column)))))
}
df <- data.frame(B = rnorm(10))
fun1(df, "B")
fun2(df, "B")
Я хотел бы, например, назвать функцию fun(df, B)
. Другие варианты, которые я рассмотрел, но не пробовал:
- Pass
column
как целое число столбца. Я думаю, что это позволит избежатьsubstitute()
. В идеале функция может принимать и. -
with(x, get(column))
, но, даже если он работает, я думаю, что это все равно потребуетsubstitute
- Используйте
formula()
иmatch.call()
, с которыми у меня много опыта.
Подзапрос: предпочтительнее do.call()
более eval()
?