无自定义函数的R克里金插值脚本打包为R包方法咨询
脚本转R包完整操作步骤
1 前置准备
先安装R包开发必备工具:
install.packages(c("devtools", "usethis", "roxygen2"))
2 脚本封装为函数
你原来的脚本属于单次运行的线性代码,存在大量硬编码逻辑(比如固定工作目录、固定谷歌文件ID、固定输出路径等),且直接调用library()加载依赖,不符合R包规范,需要先封装为参数化的可复用函数:
- 移除所有
setwd()操作,R包不允许修改用户的工作目录 - 所有硬编码的配置(文件路径、坐标系、分辨率、输出路径等)改为函数参数
- 所有第三方包的函数调用前加
包名::前缀,不允许在包代码中使用library()或require()加载依赖 - 可增加参数控制是否输出可视化结果,避免用户不需要的时候强制弹出绘图
封装后的函数示例:
#' 克里金插值生成银品位栅格 #' @param csv_id 输入csv对应的谷歌文件ID,或本地csv文件路径 #' @param crs_code 空间坐标系EPSG编码,默认值为9155(SIRGAS-Chile 2016 / UTM zone 19S) #' @param grid_res 插值网格分辨率,默认值为c(100,100) #' @param output_path 输出tif栅格文件的保存路径,默认值为"output.tif" #' @param show_plot 是否输出插值结果可视化图表,默认值为TRUE #' @return 插值结果raster对象 #' @export krige_silver <- function(csv_id = "1YOCFoHkKqkc69YfvdV-lrUThTP_32LHn", crs_code = 9155, grid_res = c(100,100), output_path = "output.tif", show_plot = TRUE){ # 读取输入数据 if(grepl("^[a-zA-Z0-9_-]{25,}$", csv_id)){ silver_data = utils::read.csv(sprintf("https://docs.google.com/uc?id=%s&export=download", csv_id)) } else { silver_data = utils::read.csv(csv_id) } # 转换为空间sf对象 silver_2 <- sf::st_as_sf(silver_data, coords = c("Este", "Norte")) silver_2 <- sf::st_set_crs(silver_2, crs_code) # 计算变异函数 varem <- gstat::variogram(silver ~ 1, silver_2, cutoff = 5000,width = 200) varex <- gstat::vgm(psill = 350, model = "Sph", range = 2000,nugget = 0) varaut <- gstat::fit.variogram(varem, varex) # 生成插值空网格 emptyr <- raster::raster(as(silver_2, "Spatial")) raster::res(emptyr) <- grid_res Emptygrid <- raster::rasterToPoints(emptyr, spatial = TRUE) sp::gridded(Emptygrid) <- TRUE Emptygrid <- as(Emptygrid, "SpatialPixels") Emptygrid <- sf::st_as_sf(Emptygrid) # 执行克里金插值 Inter <- gstat::krige(silver~1, locations=silver_2, newdata=Emptygrid, model=varaut) Inter_sp <- as(Inter, Class = "Spatial") # 输出栅格文件 r <- raster::raster(Inter_sp) raster::res(r) <- grid_res img <- raster::rasterize (x = Inter_sp, y = r, field = Inter_sp$var1.pred ) raster::writeRaster(img, output_path, overwrite = TRUE) # 输出可视化结果 if(show_plot){ print(sp::spplot(Inter_sp, "var1.pred", asp=1, main="银品位预测结果, gr/Ton")) p <- tmap::tm_shape(img) + tmap::tm_raster(n=10, palette="RdBu", auto.palette.mapping=FALSE,midpoint = NA, title="克里金预测\n银品位\n(gr/Ton)") + tmap::tm_shape(silver_2) + tmap::tm_dots(size=0.2) + tmap::tm_legend(legend.outside=TRUE) print(p) } return(img) }
3 创建R包基础结构
运行以下代码创建R包项目,替换krigingSilver为你自己的包名:
usethis::create_package("krigingSilver")
运行后会自动打开新的RStudio项目,生成R包必备的基础目录和文件。
4 保存函数到包目录
把第二步封装好的函数保存为.R文件,放到项目自动生成的R文件夹下,比如命名为krige_silver.R。
5 声明第三方依赖
你用到的所有第三方包都需要在包配置中声明,逐行运行以下代码添加依赖:
usethis::use_package("sf") usethis::use_package("sp") usethis::use_package("raster") usethis::use_package("rgdal") usethis::use_package("gstat") usethis::use_package("tmap")
运行后会自动在DESCRIPTION文件的Imports字段添加对应的依赖声明。
6 生成函数文档
运行以下代码自动生成函数帮助文档:
devtools::document()
运行后会自动生成man文件夹,里面存放函数对应的.Rd帮助文件,用户安装包后可以用?krige_silver查看函数说明。
7 本地测试
运行以下代码加载本地开发的包,测试函数是否正常运行:
devtools::load_all() # 测试调用函数 res <- krige_silver()
确认函数运行正常,输出结果符合预期。
8 检查与打包
先运行检查命令,解决所有报错和警告:
devtools::check()
检查通过后运行打包命令,生成可分发的R包安装文件:
devtools::build()
运行后会在项目同级目录生成.tar.gz格式的R包源码文件,其他人可以用install.packages("路径/krigingSilver_xxx.tar.gz", repos = NULL)安装使用。
内容的提问来源于stack exchange,提问作者Edmundo
相关产品推荐
相关产品推荐

