Символьная строка как аргумент функции r
Я работаю с dplyr и создал код для вычисления новых данных, которые отображаются с помощью ggplot.
Я хочу создать функцию с этим кодом. Он должен принимать имя столбца фрейма данных, которым манипулирует dplyr. Однако попытка работать с именами столбцов не работает. Пожалуйста, рассмотрите минимальный пример ниже:
df <- data.frame(A = seq(-5, 5, 1), B = seq(0,10,1))
library(dplyr)
foo <- function (x) {
df %>%
filter(x < 1)
}
foo(B)
Error in filter_impl(.data, dots(...), environment()) :
object 'B' not found
Есть ли решение использовать имя столбца в качестве аргумента функции?
2 ответа
Если вы хотите создать функцию, которая принимает строку "B" в качестве аргумента (как в заголовке вашего вопроса)
foo_string <- function (x) {
eval(substitute(df %>% filter(xx < 1),list(xx=as.name(x))))
}
foo_string("B")
Если вы хотите создать функцию, которая принимает захват B в качестве аргумента (как в dplyr)
foo_nse <- function (x) {
# capture the argument without evaluating it
x <- substitute(x)
eval(substitute(df %>% filter(xx < 1),list(xx=x)))
}
foo_nse(B)
Вы можете найти больше информации в Advanced R
редактировать
dplyr
делает вещи проще в версии 0.3. Функции с суффиксами "_" принимают строку или выражение в качестве аргумента
foo_string <- function (x) {
# construct the string
string <- paste(x,"< 1")
# use filter_ instead of filter
df %>% filter_(string)
}
foo_string("B")
foo_nse <- function (x) {
# capture the argument without evaluating it
x <- substitute(x)
# construct the expression
expression <- lazyeval::interp(quote(xx < 1), xx = x)
# use filter_ instead of filter
df %>% filter_(expression)
}
foo_nse(B)
Вы можете найти больше информации в этой виньетке
Я помню похожий вопрос, на который ответил @Richard Scriven. Я думаю, что вам нужно написать что-то вроде этого.
foo <- function(x,...)filter(x,...)
@Richard Scriven упомянул, что вам нужно использовать ...
Вот. Если вы напечатаете? Dplyr, вы сможете найти это: filter(.data, ...)
Я думаю, вы замените.data на x или что-то еще. Если вы хотите выбрать строки, значения которых меньше 1 в B в вашем df, это будет так.
foo <- function (x,...) filter(x,...)
foo(df, B < 1)