Let's say I have the following function:
sfn <- function(x){
gsub('"', "", deparse(substitute(x)))
}
Then sfn() returns "mpg" (for both mpg and "mpg"), this is the result I would like to get.
sfn("mpg")
#> [1] "mpg"
sfn(mpg)
#> [1] "mpg"
However, with an external vector it gets ambiguous. Is there a way to get "mpg" returned (with the same function sfn()) instead of "x[1]"? Only an external vector should be used in case the user specifies this (e.g. with a helper function). Like the following example with extvecfn() to indicate that x is an external vector:
x <- c("mpg", "cyl")
# Desired output
sfn(extvecfn(x[1]))
#> [1] "mpg"
# Desired output
sfn(x)
#> [1] "x"
Created on 2022-08-24 with reprex v2.0.2
CodePudding user response:
I would very much not recommend such a function, but technically you could look to see if someone has passed an expression, and if they did, then you can evaluate it. So you could do
sfn <- function(x){
expr <- substitute(x)
if(is.call(expr) && expr[[1]]==quote(extvecfn)) {
as.character(eval.parent(expr[[2]]))
} else if (is.character(expr)) {
x
} else {
deparse(expr)
}
}
sfn("mpg")
# [1] "mpg"
sfn(mpg)
# [1] "mpg"
x <- c("mpg", "cyl")
sfn(extvecfn(x[1]))
# [1] "mpg"
sfn(x[1])
# [1] "x[1]"
sfn(x)
# [1] "x"
But this just makes it very difficult to work with such a function in a more general way. In most cases this is just a bad idea. It's better to have separate parameters for variable values and character labels. In most cases you can have a default value for the label using deparse but it's much better if the user has some other way to set the value.
