Deparse значение функции, переданной вторичной функции - PullRequest
5 голосов
/ 29 марта 2020

У меня есть функция, определенная следующим образом:

fn1 <- function(var = NULL) {
  if (missing(var)) var else deparse(substitute(var))
}

Я могу вызвать эту функцию, и она дает мне то, что я хочу.

fn1()                                                                                                                                                
# NULL

fn1(test)                                                                                                                                            
# [1] "test"

Теперь я хочу функционализировать обработку парсинга var.

fn2 <- function(var = NULL) {
  deparse_var(var)
}

deparse_var <- function(var) {
  if (missing(var)) var else deparse(substitute(var))
}

Но это не дает мне ожидаемого результата

fn2()                                                                                                                                                
# [1] "var"

fn2(test)                                                                                                                                            
# [1] "var"

Поскольку у меня есть значение var внутри deparse_var(), я могу проверить, не это NULL. Но deparse не работает, если это не так.

deparse_var <- function(var) {
  if (is.null(var)) var else deparse(substitute(var))
}

fn2()
# [1] NULL

fn2(test)
# Error in deparse_var(var) : object 'test' not found

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

Мы можем заменить на первый кадр

deparse_var <- function(var) {
  if (is.null(var)) var else deparse(substitute(var, sys.frame(1)))
}

fn2 <- function(var = NULL) {
  deparse_var(var)
}
fn2()  
#NULL 

fn2(test)   
#[1] "test"

Или использовать missing

deparse_var <- function(var) {
   if (missing(var)) var else deparse(substitute(var, sys.frame(1)))
 }

fn2()
#[1] "NULL"
fn2(test)
#[1] "test"

Для того, чтобы исправить «NULL» на NULL, if/else можно добавить Из комментариев @ nathaneastwood

deparse_var <- function(var) {
  res <- if (missing(var)) var else deparse(substitute(var, sys.frame(1))) 
  if (res == "NULL" && is.null(var)) NULL else res
}
1 голос
/ 30 марта 2020

Как насчет ниже? Должно работать для пропущенных, NULL и др.

deparse_var <- function(var) {
  if (missing(var)) return(NULL)
  res <- deparse(substitute(var, sys.frame(1L))) 
  if (!identical(res, "NULL")) res
}

Примечание. Возможно, вы захотите настроить видимость результата по своему усмотрению.

0 голосов
/ 18 апреля 2020

Для всех, кто наткнулся на этот пост. У меня продолжали возникать проблемы с опубликованными решениями. Однако приведенное ниже решение работает.

deparse_var <- function(var) {
  sub_var <- eval(substitute(substitute(var)), parent.frame())
  if (is.symbol(sub_var)) var <- as.character(sub_var)
  var
}

Вы можете увидеть результаты ниже

fn2 <- function(var = NULL) {
  deparse_var(var)
}

fn2()
[1] NULL

fn2(test)
[1] "test"

fn2("test")
[1] "test"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...