为每个函数运行追加新行

时间:2014-01-14 19:50:05

标签: r append

我每次运行一个函数时都试图在矩阵中附加一个新行。我估计,第一次运行该函数时会创建一个矩阵,并且在后续时间内会附加一个带有值的新行。

这是一些虚拟数据。可以说xy是矩形的边和z某种ID。实际上,这些不是事先知道的,而是由功能输出的。真实函数将一个物种目录作为参数,读取shapefile,合并多边形并执行一系列其他操作,但输出表面区域。对于每个物种(即功能运行),我想将每个输出区域存储在矩阵或data.frame中以供进一步分析,而不是将其输出到单个变量。

myfunc <- function(x, y, z){
  area <- x*y
  id <- z
  tmp <- cbind(area,id)
  assign(as.matrix('mtrx'), rbind(tmp), envir=.GlobalEnv)

}

上面显然只会创建矩阵并在每次运行函数时覆盖它。

任何指针都非常感谢!

3 个答案:

答案 0 :(得分:2)

如果在您的示例中,您事先知道xyz的值,则可以这样说:

> f1 <- function(x, y, z) c(x*y, z)
mapply(f1, x=seq(4), y=seq(4), z=seq(4))

>      [,1] [,2] [,3] [,4]
[1,]    1    4    9   16
[2,]    1    2    3    4

如果这些变量的值由另一个函数返回,那么最好存储它们,直到您准备好通过最终函数运行所有值(例如上面的f1)。

你说

  

添加带有值的新行

但在RAM中,创建assign ed)新矩阵,每次追加时都会添加新行。 (你在Circle 2)。 对于小尺寸数据,这在实践中可能不是问题。

此外,使用assign可能会在调用环境中的函数(例如另一个函数)时使得范围设置变得尴尬,因此通常最好尽可能避免。通常有一个更好的选择。

答案 1 :(得分:1)

强烈推荐反对 此方法,但您需要在最后一行使用get

assign('mtrx', rbind(get('mtrx', envir=parent.frame()), tmp)), envir=.GlobalEnv)

答案 2 :(得分:1)

这是基本想法。

myfunc <- function(ID) {
  # do a bunch of stuff based on ID
  # calculate area
  area <- 2*ID + rnorm(1,0,10)   # fake the area...
  return(c(ID=ID,area=area))
}

ID.list <- rep(1:100)   # list of ID's
result <- do.call(rbind,lapply(ID.list,myfunc))
# head(result)
#      ID       area
# [1,]  1 -14.794850
# [2,]  2  13.777036
# [3,]  3  17.807578
# [4,]  4  21.070712
# [5,]  5  11.904047
# [6,]  6   3.735771

IDarea作为带有c(ID=ID, area=area)的命名向量返回。通过调用lapply(...)为所有ID执行此操作。然后使用do.call(rbind,...)将它们全部绑定在一起。