【问题标题】:append new row for each run of function为每个函数运行附加新行
【发布时间】:2014-02-03 01:10:36
【问题描述】:

每次运行函数时,我都会尝试将新行附加到矩阵中。我认为,第一次运行该函数时会创建一个矩阵,随后会添加一个带有值的新行。

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

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

}

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

任何指针将不胜感激!

【问题讨论】:

  • 第一个参数也需要是要分配的对象的名称。为什么要将字符串转换为字符矩阵?这assign('mtrx', ....) 有效吗?
  • 矩阵mtrx在你运行函数后创建...
  • 好的,但我的意思是assign 的第一个参数是您想要分配的名称的字符向量,而不是矩阵。阅读?assign
  • 我相当肯定这段代码不是你想要做的:as.matrix('mtrx')。它碰巧起作用,因为您正在创建一个维度为1 x 1 的字符矩阵,该矩阵被强制转换为一个长度为1 的向量。但这肯定不是(我猜)你想要的

标签: r append


【解决方案1】:

如果像您的示例一样,您提前知道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 中创建了一个新矩阵 (assigned),每次追加时都会添加新行。 (你在Circle 2)。 对于小型数据,这在实践中不太可能成为问题。

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

【讨论】:

  • 感谢您的评论。 (..) the first time the function is run a matrix is created and the succeeding times, a new row with values is appended 正是我想要的样子,因此only creates the matrix and overwrites it each time the function is run
【解决方案2】:

这是基本的想法。

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,...) 将它们绑定在一起。

【讨论】:

  • @jihoward:感谢您的评论。啊,是的,这看起来是个好方法!干杯!
【解决方案3】:

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

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

【讨论】:

  • 感谢您的评论。为什么推荐反对它的原因是什么?我实际上拥有的功能是合并多边形(物种分布)并计算表面积。输入参数是一个物种。我只想将所有计算的区域放入一个矩阵或数据框中以供进一步分析。
  • 分配到不同环境的明显替代方法是传递矩阵。不推荐赋值方法的原因是因为不通过矩阵几乎没有什么好处,而引入的bug和错误结果的漏洞很多。假设您的代码只有几行简单的行,这是相对无害的,但即便如此,这也会在代码中引入不必要的复杂性。换句话说,我想不出一个好的理由,但可以想出许多不这样做的坏理由。
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多