R包开发为泛型函数新建方法执行check()出现无可见绑定提示
问题产生原因
- 这是R CMD check的静态代码扫描机制导致的误报:你代码里的
geom、data是tidyverse系列函数非标准评估(NSE)语境下的列名,.是magrittr管道的占位符,三者都不需要在全局环境定义,仅在dplyr/tidyr的执行语境中生效,静态扫描找不到对应的全局变量绑定就会抛出该警告。 - R CMD check给出的
importFrom("utils", "data")建议完全是误判,不要采纳,这里的data是你自定义的嵌套列名,和utils包的data()函数没有关系。
修复方案
你可以任选以下一种方式解决:
方式1:全局声明变量(最简单快捷)
在你的包的R目录下新建一个globals.R文件,写入以下代码即可:
utils::globalVariables(c(".", "data", "geom"))
重新构建包后再执行check,警告会直接消失。
方式2:改用标准评估语法
所有tidyverse语法中用到的列名都用rlang的.data代词指代,同时替换掉管道占位符,避免非标准绑定:
# 对应部分修改为如下代码 points.nested <- sf_object %>% tidyr::nest(data = .data[["geom"]]) to_line <- function(tr) { line_obj <- sf::st_cast(sf::st_combine(tr), "LINESTRING") line_obj[[1]] } tracks <- points.nested %>% dplyr::pull(.data[["data"]]) %>% purrr::map(to_line) %>% sf::st_sfc(crs = obj$my_crs)
同时在distance2.mytrack的roxygen注释中添加@importFrom rlang .data,或者调用时写全称rlang::.data即可。
方式3:优化冗余代码,从根源消除警告
你当前将点转为线的逻辑可以大幅简化,完全不需要用到循环、tidyverse嵌套映射操作,直接用sf原生函数实现即可,同时完全规避非标准变量的使用:
# 优化后的distance2.mytrack完整代码 distance2.mytrack <- function(obj,status) { sf::sf_use_s2(status) # 直接生成POINT的sf对象,无需循环构造 point_sf <- sf::st_as_sf(obj$my_coords, coords = c(1,2), crs = obj$my_crs) # 直接合并转LINESTRING,无需嵌套映射 line_sf <- sf::st_cast(sf::st_combine(point_sf), "LINESTRING") return(as.integer(sf::st_length(line_sf))) }
该方式不仅会消除check警告,代码更简洁,执行效率也比原实现更高。
内容的提问来源于stack exchange,提问作者mm6643
相关产品推荐
相关产品推荐

