В R есть способ избежать функции substitute ()? - PullRequest
0 голосов
/ 24 октября 2019

Я столкнулся с пакетом, который использует функцию substitute для анализа параметров в одной из своих функций. Используемая функция более или менее выглядит следующим образом:

f <- function(...) {
    ref <- as.list(substitute(list(...))[-1])
    # for clarity
    print(ref)
    counter <- 0L
    for (i in ref) {
        if (as.character(i[1]) == "==") {
            counter <- counter + 1L
        }
    }
    return(counter)
}


f(df1$a == df1$b, df1$b == df1$c)
#> [[1]]
#> df1$a == df1$b
#> 
#> [[2]]
#> df1$b == df1$c
#> [1] 2

Создано в 2019-10-24 пакетом Представить (v0.3.0)

Я хотел бы передать df1$a == df1$b, df1$b == df1$c как символ, но я не могу найти способ сделать это, поскольку я не могу переопределить функцию substitute. До сих пор я пробовал несколько вариантов, но ни один из них, похоже, не работает:

char <- "df1$a == df1$b, df1$b == df1$c"

f(get(char))
#> [[1]]
#> get(char)
#> [1] 0
f(parse(text = char))
#> [[1]]
#> parse(text = char)
#> [1] 0
f(eval(parse(text = char)))
#> [[1]]
#> eval(parse(text = char))
#> [1] 0

Создан в 2019-10-24 пакетом prex (v0.3.0)

РЕДАКТИРОВАТЬ:

После ответа @ Роланда на мой первоначальный вопрос, я задаюсь вопросом, есть ли простой способ решить чуть более общий случайс функцией, использующей другой параметр:

f2 <- function(parameter, ...) {
  ref <- as.list(substitute(list(...))[-1])
  # for clarity
  print(ref)
  counter <- 0L
  for (i in ref) {
    if (as.character(i[1]) == "==") {
      counter <- counter + 1L
    }
  }
  return(counter)
}

1 Ответ

2 голосов
/ 24 октября 2019

Вы не можете выйти из substitute. Это невозможно, потому что параметры функции не оцениваются. Но вы можете сделать это:

char <- "df1$a == df1$b, df1$b == df1$c"

#turn char into list of language objects
char <- strsplit(char, ",", fixed = TRUE)[[1]]
char <- as.list(parse(text = char))

#pass to f
do.call(f, char)
#[[1]]
#df1$a == df1$b
#
#[[2]]
#df1$b == df1$c
#
#[1] 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...