解析传递给辅助函数的函数值

nat*_*ood 5 r

我有一个函数,定义如下

fn1 <- function(var = NULL) {
  if (missing(var)) var else deparse(substitute(var))
}
Run Code Online (Sandbox Code Playgroud)

我可以调用这个函数,它给了我我想要的。

fn1()                                                                                                                                                
# NULL

fn1(test)                                                                                                                                            
# [1] "test"
Run Code Online (Sandbox Code Playgroud)

我现在想要功能化var.

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

deparse_var <- function(var) {
  if (missing(var)) var else deparse(substitute(var))
}
Run Code Online (Sandbox Code Playgroud)

但这并没有给我预期的结果

fn2()                                                                                                                                                
# [1] "var"

fn2(test)                                                                                                                                            
# [1] "var"
Run Code Online (Sandbox Code Playgroud)

因为我有varinside的值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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 3

我们可以替换第一帧

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"
Run Code Online (Sandbox Code Playgroud)

或者使用missing

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

fn2()
#[1] "NULL"
fn2(test)
#[1] "test"
Run Code Online (Sandbox Code Playgroud)

为了纠正“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
}
Run Code Online (Sandbox Code Playgroud)