问题:
假设我有一个名为Hy
的函数(见下面的R代码)。如果我想让Hy
函数中的3个对象成为By
函数的输入,我该怎么办?
注意:这些函数不应该成为闭包函数(即将Hy
和By
合并到一个函数中),而不是Hy
和{ {1}}功能必须保持“分开。”
详细信息:
By
现在Hy <- function(n){
A <- rnorm(n)
B <- rcauchy(n)
invisible( list(A = A, B = B, n = n) ) ## Making all elements & arguments recognizeable
# outside the function "Hy".
}
Hy(2)
函数需要By
函数中的“A”,“B”和“n”才能工作:
Hy
答案 0 :(得分:2)
最直接的方法是分配Hy
的结果并将其传递给By
:
hy_res = Hy(n)
by_res = By(A = hy_res$A, B = hy_res$B, n = hy_res$n)
# or use with() for a little less typing
by_res = with(hy_res, By(A, B, n))
由于参数位于列表中,您还可以使用do.call
调用list
中提供的一组参数的函数:
by_res = do.call(what = By, args = Hy(n))
请注意,R 中的函数不能返回多个参数,因此您可能应该将By
的最后一行重写为return(list(C, D, E))
。
答案 1 :(得分:1)
如果您想在全局环境中更新A
和B
,请使用<<-
作为Hy
函数内的赋值运算符。
Hy <- function(n){
A <- rnorm(n)
B <- rcauchy(n)
invisible( list(A = A, B = B, n = n) ) ## Making all elements & arguments recognizeable
# outside the function "Hy".
}
By <- function(A, B, n){
C = A + 1
D = B + 1
E = n + 1
return( list( C , D, E ) )
}
Hy_vals <- Hy(1)
By(A = Hy_vals$A, B = Hy_vals$B, n = Hy_vals$n)
# C D E
# 2.718926 1.586720 2.000000