1

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
4

2 回答 2

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"
于 2013-04-04T12:50:04.657 回答
2

因为test在全球环境中不存在。substitute不评估它的论点,所以它不寻找 object testis.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
}
于 2013-04-04T12:43:05.290 回答