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