2014-01-14 85 views
0

我想一个新行追加到每个I运行时间的函数的矩阵每次运行。我认为,第一次运行函数时创建了一个矩阵,并在后面的时间中添加一个带有值的新行。追加新行的功能

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

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

} 

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

任何指针将是非常非常感谢!

+0

第一个参数需要是要分配的对象的名称。为什么你要将字符串转换为字符矩阵?这个'assign('mtrx',....)'工作吗?一旦你运行功能 –

+0

矩阵'mtrx'创建... –

+1

OK,但我的观点是第一个参数'assign'是你想分配给,而不是一个矩阵的东西的名字的特征向量。阅读'?assign'。 –

回答

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 

返回IDareac(ID=ID, area=area)名为向量。拨打电话lapply(...),为所有身份证办理。然后使用do.call(rbind,...)将它们全部绑定在一起。

+0

@jihoward:感谢您的评论。啊,是的,这看起来很不错!干杯! –

1

强烈建议这个方法,但是你需要使用get在最后一行

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

感谢您的评论。为什么是建议反对的理由?我实际上的功能是合并多边形(物种分布)并计算表面积。输入参数是一个物种。我只想将所有计算的区域放入一个矩阵或数据框中以供进一步分析。 –

+3

分配到不同环境的明显替代方法是将矩阵传递给另一个环境。针对这种分配方法的建议的原因是因为没有通过矩阵得到的结果很少,而且存在很多脆弱性和错误结果。假设你的代码只是简单的几行代码是相对无害的,但即使如此,这在代码中引入了不必要的复杂性。换句话说,我想不出一个很好的理由,但可以想到许多不该做的不好的理由。 –

2

如果,在你的榜样,你知道值x,在yz它是有道理的说这样的话:

> 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

感谢您的评论。 '(..)第一次函数运行时创建了一个矩阵,并且后面的时间,附加了一个新的带有值的行被添加了,这正是我想要它的方式,因此''只创建矩阵并且每次都覆盖它该函数运行'。 –