Программирование логических операций в качестве аргументов с использованием Tidyverse - PullRequest
0 голосов
/ 31 января 2020

Как передать логические аргументы функциям в R, программируя с помощью функций tidyverse? Этот связанный вопрос не позволяет пользователю изменять логический оператор, он предполагает, что пользователь функции всегда хочет ==.

См. Пример, приведенный ниже, и попытки до сих пор.

# example data
library(tidyverse)
dat <- tibble(x = letters[1:4], y = 1:4, z = 5:8)

# what I want to do is have a function that passes arguments to filter()
# so that I can flexibly subset data:
dat %>% 
  filter(x == "a" | y < 2)

dat %>% 
  filter(x == "b" & y < 1)

dat %>% 
  filter(y == max(y))

# what would I pass to lgl to do this in a function?
# I want to be a ble to feed in different logical expressions, notalways using
#    the same variables and operations, like the documentation for filter()
#    demonstrates

# tries so far:
fun <- function(dat, lgl) filter(dat, lgl)
fun(dat, x == "a" | y < 2)

fun <- function(dat, lgl) filter(dat, quo(lgl))
fun(dat, x == "a" | y < 2)

fun <- function(dat, lgl) filter(dat, quos(lgl))
fun(dat, x == "a" | y < 2)

fun <- function(dat, lgl) filter(dat, !!sym(lgl))
fun(dat, 'x == "a" | y < 2')

fun <- function(dat, lgl) filter(dat, !!!syms(lgl))
fun(dat, 'x == "a" | y < 2')

fun <- function(dat, lgl) filter(dat, expr(lgl))
fun(dat, x == "a" | y < 2)

fun <- function(dat, lgl) filter(dat, eval(lgl, envir = parent.frame()))
fun(dat, x == "a" | y < 2)

1 Ответ

0 голосов
/ 31 января 2020

Когда я выписывал пример, я нашел решение. Но я подумал, что опубликую здесь на всякий случай, если кто-нибудь столкнется с подобной проблемой:

> fun <- function(dat, ...) filter(dat, ...)
> fun(dat, x == "a" | y < 2)
# A tibble: 1 x 3
  x         y     z
  <chr> <int> <int>
1 a         1     5

Это, однако, своего рода обходной путь, поскольку он на самом деле не интерпретирует выражение, а просто передает аргумент вместе. Было бы интересно увидеть и другое решение.

...