我试图使用不同版本的包的计算机运行相同的R代码,但在其中一个版本中,代码可以正常运行,而在另一个版本中,它会产生错误.

具体地说,我从this link下载了文件,并将stringr‘S str_remove函数和dplyr’S rename_with函数结合在一起,重命名了sf类数据框中的变量(这样我就可以根据我在其他文件中的名称来标准化变量名称).我运行的代码如下:

library(tidyverse)
library(sf)
library(stringr)

dft <- st_read(file.path('D:', 'Downloads', 'tl_rd22_01_cd118.shp'), quiet = TRUE) %>% 
  rename_with(., .fn = str_remove, pattern = '\\d{2}$')

在其中一台计算机上,代码按预期运行(删除了一些变量名称末尾的数字),但在另一台计算机上,它产生了以下错误消息(翻译成英语时):

Error in .fn(names(agr)) : argument "pattern" missing, no pattern

但是,在显示错误的计算机中,以下代码可以正常工作.

library(tidyverse)
library(sf)
library(stringr)

dft <- st_read(file.path('D:', 'Downloads', 'tl_rd22_01_cd118.shp'), quiet = TRUE) %>% 
  st_drop_geometry(.) %>%
  rename_with(., .fn = str_remove, pattern = '\\d{2}$')

这个解决方案的问题是我松开了几何柱. 对我来说,这个错误消息似乎没有意义.问题似乎出在我在这两台电脑上的版本上.在工作正常的版本中,dplyrstringrsf的版本分别是1.0.7、1.4.0和1.0.3;在不工作的版本中,它们是1.1.4、1.5.1和1.0.14.对我来说,replace_withsf类的对象之间似乎有一些不兼容.

推荐答案

从版本1.0-13开始,sf有一个新方法:rename_with.sf:

sf:::rename_with.sf
#> function (.data, .fn, .cols, ...) 
#> {
#>     if (!requireNamespace("rlang", quietly = TRUE)) 
#>         stop("rlang required: install that first")
#>     .fn = rlang::as_function(.fn)
#>     agr = st_agr(.data)
#>     ret = NextMethod()
#>     names(agr) = .fn(names(agr))
#>     st_agr(ret) = agr
#>     ret
#> }
#> <bytecode: 0x00000235ee991c48>
#> <environment: namespace:sf>

这意味着在本例中,...不会像rename_with.data.frame那样传递给函数:

dplyr:::rename_with.data.frame
#> function (.data, .fn, .cols = everything(), ...) 
#> {
#>     .fn <- as_function(.fn)
#>     cols <- tidyselect::eval_select(enquo(.cols), .data, allow_rename = FALSE)
#>     names <- names(.data)
#>     sel <- vec_slice(names, cols)
#>     new <- .fn(sel, ...)
#>     if (!is_character(new)) {
#>         cli::cli_abort("{.arg .fn} must return a character vector, not {.obj_type_friendly {new}}.")
#>     }
#>     if (length(new) != length(sel)) {
#>         cli::cli_abort("{.arg .fn} must return a vector of length {length(sel)}, not {length(new)}.")
#>     }
#>     names <- vec_assign(names, cols, new)
#>     names <- vec_as_names(names, repair = "check_unique")
#>     set_names(.data, names)
#> }
#> <bytecode: 0x00000235ee381aa0>
#> <environment: namespace:dplyr>

对于一种可行的方法,您可以try 使用purrr函数显式传递参数:

library(tidyverse)
library(sf)

download.file("https://www2.census.gov/geo/tiger/TIGER_RD18/LAYER/CD/tl_rd22_01_cd118.zip", "tl_rd22_01_cd118.zip")

unzip("tl_rd22_01_cd118.zip")

st_read('tl_rd22_01_cd118.shp', quiet = TRUE) |> 
  rename_with(~ str_remove(.x, pattern = '\\d{2}$')) 
#> Simple feature collection with 7 features and 12 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -88.47323 ymin: 30.14442 xmax: -84.88825 ymax: 35.00803
#> Geodetic CRS:  NAD83
#>   STATEFP GEOID CD118FP                 NAMELSAD LSAD CDSESSN MTFCC FUNCSTAT
#> 1      01  0101      01 Congressional District 1   C2     118 G5200        N
#> 2      01  0102      02 Congressional District 2   C2     118 G5200        N
#> 3      01  0103      03 Congressional District 3   C2     118 G5200        N
#> 4      01  0104      04 Congressional District 4   C2     118 G5200        N
#> 5      01  0105      05 Congressional District 5   C2     118 G5200        N
#> 6      01  0106      06 Congressional District 6   C2     118 G5200        N
#> 7      01  0107      07 Congressional District 7   C2     118 G5200        N
...

或者在函数调用中显式使用dplyr:::rename_with.data.frame方法:

st_read('tl_rd22_01_cd118.shp', quiet = TRUE) |>
  dplyr:::rename_with.data.frame(., .fn = str_remove, pattern = '\\d{2}$')

编辑建议的修复

我会建议GitHub的一个潜在修复,因为我认为最容易的调整是将this line从:

names(agr) = .fn(names(agr))

致:

names(agr) = .fn(names(agr), ...)

R相关问答推荐

根据列表中项目的名称多次合并数据框和列表

如何使用rmarkdown和kableExtra删除包含折叠行的表的第一列的名称

随机森林回归:下拉列重要性

如何利用模型函数在格图中添加双曲/指数曲线

当两个图层映射到相同的美学时,隐藏一个图层的图例值

在另一个函数中调用ggplot2美学

R根据条件进行累积更改

如何在Chart_Series()中更改轴值的 colored颜色 ?

Ggplot2中的重复注记

在嵌套列表中查找元素路径的最佳方法

我正在努力用R计算数据集中的中值逐步距离

使用rvest从多个页面抓取时避免404错误

在R函数中使用加号

将选定的索引范围与阈值进行比较

将多个列值转换为二进制

使用geom_iles在一个切片中包含多个值

带RStatix的Wilcoxon环内检验

如何在Quarto中使用美人鱼图表中的标记来加粗文本

将美学添加到ggploy中的文本标签

使用nls()函数的非线性模型的半正态图