如何将R中job::job()的环境输出转为可用变量?
问题
处理超过4TB的激光雷达(lidar)数据时,使用LidR包对LAScatalog执行高度归一化函数,并通过job::job()将任务作为后台运行。代码如下:
las_dir <- "path/to/.las/files/" las_cat <- readLAScatalog(las_dir, filter = "-drop_overlap -drop_class 6 7 9 13 14 15 16 17 18 0 -keep_random_fraction 0.1") # 创建基于k近邻逆距离加权的高度归一化函数 norm_height_knnidw <- function(chunk) { las <- readLAS(chunk) if (lidR::is.empty(las)) return(NULL) las <- normalize_height(las, algorithm = knnidw()) } # 设置LAScatalog的参数 opt_chunk_size(las_cat) <- 250 opt_chunk_buffer(las_cat) <- 5 opt_output_files(las_cat) <- paste0(tempdir(), "{XLEFT}_normed", overwrite = TRUE) opt_stop_early(las_cat) <- FALSE opt <- list(automerge = TRUE) # 后台运行任务 job::job(las_normed = { options(mc.cores = 16) # 24核高性能机器 # 运行高度归一化 catalog_apply(las_cat, norm_height_knnidw, .options = opt) })
任务运行完成(耗时5天9小时),但输出的las_normed是环境对象,无法进行后续LAScatalog操作:
> class(las_normed) [1] "environment" > str(las_normed) <environment: 0x00000293a7b4c538> # 尝试设置后续处理的输出路径时报错 > opt_output_files(las_normed) <- paste0(las_output, "{*}_dtm_pitfree", overwrite = TRUE) Error in ctg@chunk_options : no applicable method for `@` applied to an object of class "environment"
需要将该环境对象转换为可用的LAScatalog变量,或明确job初始设置时遗漏的步骤。
解决方案
- 提取环境中的实际结果
job::job()返回的环境对象存储了代码块内生成的所有变量,先查看环境内的变量名,再提取目标结果:
# 查看环境内的变量列表 ls(las_normed) # 提取实际的LAScatalog结果(替换为ls输出的对应变量名) actual_las_normed <- las_normed$las_normed
- 修正job调用语法(避免后续歧义)
当前的job调用语法存在参数赋值歧义,建议在代码块内部显式将结果赋值给变量:
# 正确的后台任务调用方式 job_env <- job::job({ options(mc.cores = 16) # 显式将归一化结果赋值给变量 las_normed <- catalog_apply(las_cat, norm_height_knnidw, .options = opt) }) # 从环境中提取LAScatalog对象 actual_las_normed <- job_env$las_normed
- 验证结果有效性
提取后检查变量类型,确认是可用的LAScatalog:
class(actual_las_normed) # 预期输出:"LAScatalog" "R6"
之后即可对actual_las_normed执行后续的LAScatalog操作。
内容的提问来源于stack exchange,提问作者Dr-JH-o'clock
相关产品推荐
相关产品推荐

