【问题标题】:Pass variable name to a function and output inside of loop in R将变量名传递给函数并在R中的循环内输出
【发布时间】:2012-12-16 00:24:44
【问题描述】:

这个问题似乎有变体,但似乎没有一个解决处于循环和命名和输出文件中的情况。我认为这可能如何工作:

for(j in 1:3) {
    for(k in 1:17){
       extract_[j]km <- extract(RasterStack, SpatialPolygonsDataFrame_[j]km, layer=[k], nl=1, df=TRUE)
    }
}

提取功能来自光栅包。我已经创建了一系列 RasterStacks 和 SpatialPolygons,我想将它们传递给具有多个参数的函数(“提取”),其中一些我希望通过循环进行操作,并相应地标记输出。这在 BASH 中是一件轻而易举的事,但我无法在 R 中解决这个问题。

最终,我也想传递字符串,但 another post 似乎显示了那里的方式。

编辑:我最初将上述函数发布为单个数据帧,而实际上,它们是栅格包中的指定对象(最终是数据帧)。

【问题讨论】:

  • 您可以使用assign 执行此操作,但不建议这样做。相反,R 方法是将每个分配为命名列表的一个元素。在get 和assign 之间,有很多绳子可以吊死自己,但建议重新考虑您的方法并使用 R 提供的一些列表工具。
  • 您的更新有问题。它将返回 extract[1]km for layer=17, extract[2]km for layer=17 and extract[3]km for layer=17.
  • 为了后代,可以在这里找到函数作者的回答:r-sig-geo.2731867.n2.nabble.com/…
  • @RomanLuštrik - 这行得通...应该作为答案包含在内吗?
  • 为了完整起见,如果罗伯特可以顺便过来并将其发布为答案,那就太好了。 :)

标签: r for-loop raster


【解决方案1】:

正如 Justin 所指出的,使用列表更符合 R 的结构,而不是使用大量命名变量来搞乱工作区。当您在工作区中有很多对象要“知道”接下来会发生什么时,工作很快就会变得很有挑战性。

你的方式:

for(j in 1:3) { 
assign(
   paste("extract",j,"km",sep=""), # or paste0 to avoid need for sep=""
   function(
            get(
                paste("data",j,"km",sep="")
               )
           )
      )
}

就个人而言,我更喜欢使用列表,因此在下面,我将您的数据对象转换为列表,并向您展示如何在该列表的所有元素上运行函数。以这种方式工作通常会降低以“get”和“assign”方式使用字符串的需要。

# just converting your variables to a list    
data.list <- mget(grep("data",ls(),value=TRUE),envir=.GlobalEnv) 

# then output results
result.list <- lapply(data.list,your_function) 

【讨论】:

  • 我遇到了data.list &lt;- mget(grep("data",ls(),value=TRUE),envir=.GlobalEnv) 的小问题。 grep() 似乎匹配任何包含字符串“data”的东西,所以如果我在工作区中有一个名为 data.fnc() 的对象,它也会检索它。您碰巧知道任何解决方法吗?
  • 将对象命名为“数据”通常是不好的做法,因为这是基本 R 中的保留字。无法看到您的工作区,我无法“看到”您正在尝试的内容去做。不过,也许你可以试试:grep("data[0-9*]",ls(),value=TRUE)
  • 我想我看到了列表方法对于我给出的玩具示例可能是如何工作的,但我的函数实际上有点复杂。我已经更新了原始帖子以更详细地反映该功能。希望有一种更直接的方式将字符串/数字传递给函数。
  • 通过字符串调用或创建对象的直接方法是使用 paste()、get() 或 assign() 的组合。由于我不知道 extract() 返回什么,除非您向我们提供示例数据和您期望返回的示例,否则我无法提供更多帮助。
  • @BrandonBertelsen - +1 寻求帮助,但上面发布的链接有效。我一开始就没有正确地提出问题,这很糟糕。
猜你喜欢
  • 2011-02-26
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2019-11-27
相关资源
最近更新 更多