Символьная строка как аргумент функции 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)
Другие вопросы по тегам