Как правильно поместить строки в кавычках в функции Rlang? - PullRequest
0 голосов
/ 10 ноября 2018

Я пишу функцию, которую я буду регулярно использовать для фильтрации дат и имен в нашей базе данных (а затем для выполнения некоторых ежемесячных подсчетов / расчетов по ним). Я хотел бы знать, как правильно в этом случае вставлять и оценивать строки в rlang функциях?

Я правильно делаю, используя quo для ввода строк в fuction?

Пример:

 business_flights = tibble(passanger_name=rep(c(rep("John RED",3),rep("Mary ORANGE",3)),4),
                              dep_date=seq(from = lubridate::ymd('2005-04-07'), 
                                           to = lubridate::ymd('2025-03-22'), length.out = 24),
                              flight_num = sample(seq(from = 99, to = 1999, by = 30), size = 24, replace = TRUE))

filter_flights = function(mytibble, name, date0, date1) {
  require(tidyverse); require(lubridate)
  flights_filtered = mytibble %>%
    filter(dep_date >= !!date0, dep_date < !!date1,
           grepl(!!name, passanger_name))
  View(flights_filtered)
}

filter_flights(mytibble = business_flights, 
               name = quo("RED"), 
               date0 = quo("2005-10-13"), 
               date1 = quo(today()))

1 Ответ

0 голосов
/ 17 ноября 2018

Нестандартная оценка позволяет вам захватывать и манипулировать выражениями. В базе R это в основном достигается с помощью quote:

quote(x)
# x

quote( a*log10(b+5) )
# a * log10(b + 5)

Однако любое захваченное выражение, состоящее из одного литерала, само по себе является литералом:

identical( quote(5), 5 )          # TRUE
identical( quote("a"), "a" )      # TRUE
identical( quote(FALSE), FALSE )  # TRUE
identical( quote(5+5), 10 )       # FALSE, expression is not a single literal

rlang::quo от tidyverse основывается на этой функциональности путем захвата выражения И среды, в которой появилось это выражение. Вместе они определяют quosure :

quo(x)
# <quosure>
# expr: ^x
# env:  global

f <- function() {quo(x)}
f()
# <quosure>
# expr: ^x
# env:  0x55b7e61d5c80

Хранение выражений рядом с их средами позволяет вам гарантировать, что они всегда оцениваются согласованным образом, пока они пробираются через ваш код:

x <- 5
g <- function( myexpr ) {
  x <- 10
  eval_tidy( myexpr ) 
}

x                 # Evaluate expression directly in its environment
# 5

g( quote(x) )     # Evaluate expression inside g()
# 10

g( quo(x) )       # Evaluate expression in its env, while inside g()
# 5

Однако при захвате литерала внутри фразы quo назначает ему пустое окружение:

quo("x")
# <quosure>
# expr: ^"x"
# env:  empty

Это потому, что строка "x" всегда будет иметь значение "x", независимо от того, в какой среде она оценивается. Поэтому почти никогда не существует веской причины для quo строкового объекта (или любого литерала для это важно). Он ничего не делает, и, как указано в комментариях, ваш код будет работать без него.

...