我想在函数中定义一个变量,并在调用另一个函数时使用它。 让我们考虑以下示例:
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
。
答案 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
。
<<-