如何在函数中定义变量并使用它来调用另一个函数

时间:2017-05-23 11:56:00

标签: r function

我想在函数中定义一个变量,并在调用另一个函数时使用它。 让我们考虑以下示例:

my.func1 <- function(x){a*x^2}

temp.variable <- 2

my.func2 <- function(x){
  a <- temp.variable
  y <- my.func1(x)
  return(y)
}

当我运行my.func2(2)时,我希望最终得到8,但R无法对其进行评估。

我应该如何设计我的第二个函数my.func2,以便最终获得所需的返回值?

我知道我可以让my.func1成为x AND a的函数,但我需要my.func1才能成为x的函数AS

2 个答案:

答案 0 :(得分:4)

问题出现是因为函数维护了创建它的环境。由于my.func1是在全局环境中创建的,因此它只能查找该环境中的对象(如果在其他情况下存在,则为环境的父对象)。

另一种方法是临时更改my.func2中my.func1的环境。 (你实际上是my.func1副本的环境)

my.func2 <- function(x){
  # change environment of my.func1
  environment(my.func1) <- environment()
  a <- temp.variable
  y <- my.func1(x)
  return(y)
}

然后你得到你想要的结果。在我看来,这比全局赋值<<-更可取,因为它不会操纵函数之外的任何东西,因此更接近函数式编程的原则。

my.func2(2)
[1] 8

Hadley的Advanced R提供了lengthy discussion此问题及相关问题。

理想的解决方案是为my.func1提供两个参数,但由于你指定这是不可能的,这是一个相当无害的解决办法。

答案 1 :(得分:3)

Panel内使用a <- c("6_S6_annotated_filtered.vcf.gz877", "7_S7_annotated_filtered.vcf.gz569") gsub('[0-9]+_(S[0-9]+)_annotated_filtered.vcf.*',"\\1",a) #[1] "S6" "S7" a <<- temp.variable将确保在全局环境中可以访问my.func2

<<-