我有一个函数,定义如下
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)
我们可以替换第一帧
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)