如何编写使用其他函数的单个输出作为新分析的起点的函数?

时间:2014-10-09 00:20:50

标签: r loops lapply

我在编写调用另一个函数的函数时遇到问题,并使用输出作为在循环(或等效函数)中运行新分析的基础。例如,假设函数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),并对多个循环不断进行计算。在此过程中,我想将输出收集在一个单独的文件中以供审核。非常感谢!

2 个答案:

答案 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