我每次运行一个函数时都试图在矩阵中附加一个新行。我估计,第一次运行该函数时会创建一个矩阵,并且在后续时间内会附加一个带有值的新行。
这是一些虚拟数据。可以说x
和y
是矩形的边和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)
}
上面显然只会创建矩阵并在每次运行函数时覆盖它。
任何指针都非常感谢!
答案 0 :(得分:2)
如果在您的示例中,您事先知道x
,y
和z
的值,则可以这样说:
> 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
将ID
和area
作为带有c(ID=ID, area=area)
的命名向量返回。通过调用lapply(...)
为所有ID执行此操作。然后使用do.call(rbind,...)
将它们全部绑定在一起。