R中的参数函数

时间:2017-12-03 00:30:59

标签: r function

我正在尝试在R中编写一个函数:

y<-function(x){2*x^2}

它适用于所有给定的数字。例如:

> y(2)
[1] 8

但它无法返回如下的参数化答案:

 > y(a)
 [1] 2*a^2

如何在R?

中创建这样的函数

2 个答案:

答案 0 :(得分:5)

1)替换尝试substitute

yy <-function(x) substitute(2*x^2)
yy(a)
## 2 * a^2

2)在x上调度S3 如果传递fsubstitute类的对象,则定义使用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"