R 中的多对象操作

Multiple object manipulation in R

我在此处尝试设置的功能遇到问题。我觉得答案会很简单,但我对 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)}

不幸的是,我不断收到

Error in paste0("x", "_45_1", sep = "") <- raster::mask(vocc_45_1_rotated, :
target of assignment expands to non-language object "

我看到了类似 "Error" 问题的回复,但没有任何提示提示我需要在此处更改什么。

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

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

我们通过将 vocc 输入对象强制为带引号的字符串来创建新对象名称(参见:?deparse 和 ?substitute 或参见下文了解其工作原理)。然后我们替换字符串中的所有字母,但不是下划线,这样我们就可以获得唯一的 _42_1 或用于单独标识您的对象的任何内容。引用 .GlobalEnv 以便函数将其 return 分配给顶级环境,而不是函数环境,并在分配中评估 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)
}

处理大量具有自己名称的对象总是乏味且容易出错。因此,我建议将所有类似结构的对象收集在一个列表中,并使用 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"]]