объединить предложения и строку

Я ищу способ объединить запрос и строку, результатом которой является запрос. На самом деле, если я использую paste0() и quo_name(), я могу это сделать. Но мне интересно, есть ли более элегантная альтернатива написанию функции в моем пакете. Это общий пример:

library(dplyr)

df <- data_frame(
  z_1 = 1,
  z_2 = 2,
  y_1 = 10,
  y_2 = 20
)

get_var <- function(.data, var) {
  xx = enquo(var)

  select(.data, paste0(quo_name(xx), "_1"), paste0(quo_name(xx), "_2"))
}

get_var(df, z)
# A tibble: 1 x 2
    z_1   z_2
  <dbl> <dbl>
1     1     2

person Italo Cegatta    schedule 13.09.2017    source источник


Ответы (1)


Без функции это делается с помощью dplyr:

library(dplyr)
df %>%
  select(starts_with("z_"))

Вы также можете создать функцию и передать строку для имени переменной следующим образом:

get_var= function(df, var){
  df %>%
    select(starts_with(paste0(var, "_")))
}

get_var(df, "z")

Теперь сложная часть возникает, когда вы пытаетесь передать имя переменной, не заключая его в кавычки, в функцию (код R, а не содержащееся в нем значение). Один из способов сделать это - deparse + substitute в Base R. Это преобразует символ, предоставленный в var, в строку, которая удобна для дальнейшего использования в функции:

get_var = function(df, var){
  var_quo = deparse(substitute(var))
  df %>%
    select(starts_with(paste0(var_quo, "_")))
}

Наконец, вот как сделать то же самое с enquo и quo_name в rlang/tidyverse пакете:

library(rlang)
get_var = function(df, var){
  var_quo = quo_name(enquo(var))
  df %>%
    select(starts_with(paste0(var_quo, "_")))
}

get_var(df, z)
get_var(df, y)

Результат:

# A tibble: 1 x 2
    z_1   z_2
  <dbl> <dbl>
1     1     2

# A tibble: 1 × 2
    y_1   y_2
  <dbl> <dbl>
1    10    20

Примечания:

  1. Quosures - это выражения в кавычках, которые отслеживают среду.
  2. enquo принимает символ, относящийся к аргументу функции, цитирует код R и связывает его с окружением функции в запросе.
  3. quo_name форматирует предложение в строку, которую можно использовать позже в функции.
  4. quo_text похож на quo_name, но не проверяет, является ли ввод символом.

Проверьте это:

  1. rlang документация
  2. Нестандартная оценка в R
  3. ?enquo
  4. ?quo_name
person acylam    schedule 13.09.2017
comment
Если вы можете передать имя переменной на ваш выбор, я буду поддерживать. starts_with - это подход, который я бы использовал - person CPak; 14.09.2017
comment
@CPark Понятно. Итак, вы хотите иметь возможность передавать саму переменную, а не строку типа "z"? Например, get_var(df, "z") вас не устраивает? - person acylam; 14.09.2017
comment
Кстати, я не ОП. В основном OP хочет определить функцию, в которой фрейм данных и столбец для выбора динамически передаются в качестве аргументов. - person CPak; 14.09.2017
comment
@CPak Мне плохо. Это больше похоже на то, что хотел OP? - person acylam; 14.09.2017