From 709b2abb38dd98252da479388db35e9106526561 Mon Sep 17 00:00:00 2001 From: Bill Denney Date: Thu, 12 Sep 2024 14:36:15 -0400 Subject: [PATCH] Fix issue where the sf package "sf_column" may not be the last column in an sf object (#579) --- NEWS.md | 2 ++ R/clean_names.R | 10 +++++----- tests/testthat/test-clean-names.R | 9 +++++++++ tests/testthat/testdata/issue-578-sf.rds | Bin 0 -> 8256 bytes 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 tests/testthat/testdata/issue-578-sf.rds diff --git a/NEWS.md b/NEWS.md index c4356e67..73de1b00 100644 --- a/NEWS.md +++ b/NEWS.md @@ -25,6 +25,8 @@ These are all minor breaking changes resulting from enhancements and are not exp * `get_one_to_one()` no longer errors with near-equal values that become identical factor levels (fix #543, thanks to @olivroy for reporting) +* `clean_names()` for sf objects now works in cases when the sf_column is not the last column name (fix #578, thanks to @ar-puuk for reporting and @billdenney for fixing) + ## Refactoring * Remove dplyr verbs superseded in dplyr 1.0.0 (#547, @olivroy) diff --git a/R/clean_names.R b/R/clean_names.R index b8fe3b5f..ee8efe6e 100644 --- a/R/clean_names.R +++ b/R/clean_names.R @@ -97,14 +97,14 @@ clean_names.sf <- function(dat, ...) { } # nocov end # get old names sf_names <- names(dat) - # identify ending column index to clean - n_cols <- length(dat) - 1 + # Clean the names except for the "sf_column" which is used internally by sf + cols_to_rename <- which(!(sf_names %in% attr(dat, "sf_column"))) # clean all but last column - sf_cleaned <- make_clean_names(sf_names[1:n_cols], ...) + sf_cleaned <- make_clean_names(sf_names[cols_to_rename], ...) # rename original df - names(dat)[1:n_cols] <- sf_cleaned + names(dat)[cols_to_rename] <- sf_cleaned - return(dat) + dat } #' @rdname clean_names diff --git a/tests/testthat/test-clean-names.R b/tests/testthat/test-clean-names.R index 96e8809c..45ea6e3f 100644 --- a/tests/testthat/test-clean-names.R +++ b/tests/testthat/test-clean-names.R @@ -461,6 +461,15 @@ test_that("Names are cleaned appropriately without attaching sf", { expect_equal(names(clean)[4], "cnty_id") expect_s3_class(clean, "sf") + + # Issue #578, sf_column attribute needs to be untouched, it may not be the + # last column name + issue_578_sf <- readRDS("testdata/issue-578-sf.rds") + issue_578_sf_clean <- clean_names(issue_578_sf) + expect_error( + print(issue_578_sf_clean), + NA + ) }) test_that("Names are cleaned appropriately", { diff --git a/tests/testthat/testdata/issue-578-sf.rds b/tests/testthat/testdata/issue-578-sf.rds new file mode 100644 index 0000000000000000000000000000000000000000..5c208947c091abf2b8847bdb303ca11f20ea69d6 GIT binary patch literal 8256 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 literal 0 HcmV?d00001