我在编写调用另一个函数的函数时遇到问题,并使用输出作为在循环(或等效函数)中运行新分析的基础。例如,假设函数1创建此输出:10。第二个函数将此作为运行新分析的起点。然后,来自第二个输出的单个数据点将成为下一轮分析的基础,依此类推。
这是一个简单的例子。问题是如何为此创建一个for循环。或者也许使用lapply更有效。无论如何,第一个函数可能如下:
f.1 <-function(x) {
x
a <-seq(x,by=1,length.out=5)
a.1 <-tail(a,1)
}
第二个函数调用第一个函数,可以按如下方式运行:
f.2 <-function(x) {
f.1 <-function(x) {
a <-seq(x,by=1,length.out=5)
a.1 <-tail(a,1)
}
z <-f.1(x)
y=z+1
seq(y,by=1,length.out=5)
}
如何修改f.2(),以便使用前一个输出重新运行该计算作为下一轮分析的基础。确切地说,f.1(10)输出:
[1] 14
反过来,f.2(10)导致:
[1] 15 16 17 18 19
如何重新编写f.2(),以便在下一次迭代时自动计算f.2(19),并对多个循环不断进行计算。在此过程中,我想将输出收集在一个单独的文件中以供审核。非常感谢!
答案 0 :(得分:2)
magrittr
库(最常用的是dplyr
)使这种类型的链接变得有些简单。首先,定义函数,
f.1 <-function(x) {
x
a <- seq(x, by=1, length.out=5)
a.1 <- tail(a,1)
}
f.2 <-function(x) {
y <- x+1
seq(y, by=1, length.out=5)
}
然后
library(magrittr)
f.1(10) %>% f.2
# [1] 15 16 17 18 19
正如@BondedDust所提到的,你可以使用Reduce
,虽然通常它会反复使用相同的功能,所以你只需要翻转最常见的用例
Reduce(function(x,f) f(x), list(f.1, f.2), init=10)
# [1] 15 16 17 18 19
答案 1 :(得分:1)
您可以使用 f.2 的两个参数尝试此操作。第一个参数是初始化 x 所需的 x 值,而 n 是您要执行的迭代次数。函数的输出将是一个包含 n 行和5列的矩阵。
f.2 <-function(x, n) {
c <- matrix(nrow=n, ncol=5)
for (i in 1:nrow(c))
{
z <-f.1(x) ##if you have already defined your f.1(x) beforehand, there is no need to define it again in f.2. you can simply use z <- f.1(x) like it is done here
y=z+1
c[i,] = seq(y, by=1, length.out=5)
x = c[i,5]
}
return(c)
}
的输出
f <- f.2(10, 10) ##initialising x with 10 and running 10 loops
f
[,1] [,2] [,3] [,4] [,5]
[1,] 15 16 17 18 19
[2,] 24 25 26 27 28
[3,] 33 34 35 36 37
[4,] 42 43 44 45 46
[5,] 51 52 53 54 55
[6,] 60 61 62 63 64
[7,] 69 70 71 72 73
[8,] 78 79 80 81 82
[9,] 87 88 89 90 91
[10,] 96 97 98 99 100