我正在尝试在R中编写一个函数:
y<-function(x){2*x^2}
它适用于所有给定的数字。例如:
> y(2)
[1] 8
但它无法返回如下的参数化答案:
> y(a)
[1] 2*a^2
如何在R?
中创建这样的函数答案 0 :(得分:5)
1)替换尝试substitute
:
yy <-function(x) substitute(2*x^2)
yy(a)
## 2 * a^2
2)在x上调度S3 如果传递f
或substitute
类的对象,则定义使用name
的通用call
并以数字方式对其进行评估。
f <- function(x, ...) UseMethod("f")
f.name <- f.call <- function(x, ...) substitute(2*x^2, list(x = x))
f.default <- function(x, ...) 2*x^2
a <- 2
f(a)
## [1] 8
f(quote(a)) # quote(a) has name class
## 2 * a^2
f(quote(a + 1)) # quote(a + 1) has call class
## 2 * (a + 1)^2
3)数字如果参数只包含数字和可能的前导减号,则计算参数,否则执行替换返回表达式。
ff <- function(x) {
if (grepl("^-?\\d+$", deparse(substitute(x)))) 2*x^2 else substitute(2*x^2)
}
ff(2)
## [1] 8
ff(a)
## 2 * a^2
请注意,如果a <- 2
如上所述,但我们想以数字方式对其进行评估,我们仍然可以使用do.call
:
a <- 2
do.call("ff", list(a))
## [1] 8
4)S3调度替换(x)这就像(2)但检查substitute(x)
的类而不是x
的类:
h <- function(x, ...) UseMethod("h", substitute(x))
h.numeric <- function(x, ...) 2*x^2
h.default <- function(x, ...) substitute(2*x^2)
h(2)
## [1] 8
h(a)
## 2 * a^2
a <- 2
do.call("h", list(a))
## [1] 8
答案 1 :(得分:2)
我在函数中添加了if-else
语句,以确定输入对象是否为数字。如果它不是数字,它将返回带有表达式的字符串。否则,它将返回数字输出。
y <- function(x){
x2 <- as.character(substitute(x))
x3 <- suppressWarnings(as.numeric(x2))
if (is.na(x3)){
answer <- paste0("2*", x2, "^2")
} else {
answer <- 2*x3^2
}
return(answer)
}
y(2)
# [1] 8
y(a)
# [1] "2*a^2"