【问题标题】:Multiple object manipulation in RR中的多对象操作
【发布时间】:2017-04-17 08:25:05
【问题描述】:

在这里,我尝试设置的功能遇到问题。我觉得答案会很简单,但我对 R 有点陌生并且卡住了,所以我会很感激另一种意见。 本质上,我要做的是在多个光栅文件上应用掩码函数,使用单个形状文件作为参数,并将我的输出保存在与我正在处理的光栅文件一样多的对象中。例如:

masking <- function(x){
 paste0('x','_45_1',sep='') <- raster::mask(vocc_45_1_rotated,x)
 paste0('x','_45_2',sep='') <- raster::mask(vocc_45_2_rotated,x)
 paste0('x','_45_3',sep='') <- raster::mask(vocc_45_3_rotated,x)
 paste0('x','_85_1',sep='') <- raster::mask(vocc_85_1_rotated,x)
 paste0('x','_85_2',sep='') <- raster::mask(vocc_85_2_rotated,x)
 paste0('x','_85_3',sep='') <- raster::mask(vocc_85_3_new,x)}

不幸的是,我一直得到一个

粘贴错误0("x", "_45_1", sep = "") 赋值目标扩展为非语言对象"

我看到了对类似“错误”问题的回复,但没有任何内容可以提示我需要在此处更改什么。

【问题讨论】:

  • LHS 不能是函数。如果要为对象动态分配名称,请使用 assign
  • @AdamQuek 只有那些完全理解为什么永远不应该使用assign函数的人才能使用assign函数。 (fortunes::fortune("assign"))
  • 你为什么不用list()?恐怕您的整个处理管道都是基于操纵变量名,这在大多数情况下并不是最好的方法。
  • @UweBlock 很棒的报价! :D

标签: r function output mask naming


【解决方案1】:

处理大量具有自己名称的对象总是乏味且容易出错。因此,我建议将所有结构相似的对象收集在一个列表中,并使用lapply() 一次性操作列表中的所有对象。这样,您可以轻松构建处理管道。

为了说明这一点,请看这个例子:

# create list of objects
vocc <- list(vocc_45_1_rotated, 
             vocc_45_2_rotated, 
             vocc_45_3_rotated, 
             vocc_85_1_rotated, 
             vocc_85_2_rotated,
             vocc_85_3_new)

# name the objects in the list
vocc <- setNames(vocc,
                 c("vocc_45_1", 
                   "vocc_45_2", 
                   "vocc_45_3", 
                   "vocc_85_1", 
                   "vocc_85_2",
                   "vocc_85_3"))

# apply raster::mask function on all objects in list,
# thereby using x as named parameter to function
# The result is again a list
masked_vocc <- lapply(vocc, raster::mask, mask = x)

您可以按位置检索列表中的对象

masked_vocc[[3]]

或按名称

masked_vocc[["vocc_45_3"]]

【讨论】:

  • 效果很好..!感谢@Uwe 的回复,我想到了“list() 和 setNames()”的方式,但我认为也许还有另一种方式可以单独返回光栅砖输出并适当命名。谢谢你的评论更正,伙计!! xD
【解决方案2】:

应该这样做,虽然我不确定你的 x 代表什么

但是对于处理,x 代表上面的 x 是什么,vocc 代表您在上面的示例中静态列出的 vocc 数据对象,env 代表分配输出的环境。

我们通过将vocc 输入对象强制为带引号的字符串来创建新对象名称(参见:?deparse 和?substitute 或参见下文了解其工作原理)。然后我们将字符串中的所有内容替换为字母,但不是下划线,以便我们可以获得唯一的 _42_1 或用于单独标识您的对象的任何内容。引用 .GlobalEnv 以便函数将其返回分配给顶级 env,而不是函数环境,并在分配内评估 raster:: 函数。有关详细信息,请参阅assign

deparse(substitute(mtcars))
[1] "mtcars"

masking <- function(x,vocc = NULL, env = .GlobalEnv){
    name_var <- deparse(substitute(vocc))
    n_parts <- gsub('[a-z]|(?=_)','',name_var, perl = TRUE)
    new_name <- sprintf('x%s', n_parts)
    assign(new_name, raster::mask(vocc, x), envir = env)
}

【讨论】:

  • 感谢@Carl 的回复。我将深入检查 deparse、substitute 和 assign 函数,因为我注意到你在“参数化”时需要小心一点,当我让它以这种方式工作时会回复你。干杯!
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多