我希望能够使用deparse
功能,如果我这样做
g = function(x) deparse(substitute(x))
然后没关系
R) g(test)
[1] "test"
但是,如果我想测试g
的参数是否为character
h = function(x) {if(is.character(x)){return(x)}; deparse(substitute(x))}
R) h(test)
Error in h(test) : object 'test' not found
为什么会发生这种情况,我可以解决它吗?
编辑:从新的R --vanilla
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252
[2] LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
答案 0 :(得分:4)
问题中的代码试图评估一个不存在的变量test
,因此错误。试试这个:
g = function(x) {
x.try <- try(x, silent = TRUE)
if (!inherits(x.try, "try-error") && is.character(x.try)) x.try
else deparse(substitute(x))
}
# test it out
if (exists("test")) rm(test)
g(test) # "test"
g("test") # "test"
test <- "xyz"
g(test) # "xyz"
g("test") # "test"
test <- 3
g(test) # "test"
g("test") # "test"
答案 1 :(得分:2)
因为全局环境中不存在test
。 substitute
不评估其参数,因此它不会查找对象test
。 is.character
会对其参数进行求值,因此在找不到test
时会抛出错误。
h <- function(x) {if(is.character(x)) x else deparse(substitute(x))}
test <- "hello"
h(test)
如何解决问题取决于当对象不存在时您希望函数执行的操作。如果您希望它返回对象名称,请执行以下操作:
h <- function(x) {
var <- deparse(substitute(x))
if(exists(var) && is.character(x)) x else var
}