在我的一个R-package中,我有一些我想删除的愚蠢的示例数据。为此,我首先要遵循常用的方法来弃用然后将其解散。
为了从R-package中删除函数,我找到了这样的方法:
oldFunc <- function()
{
.Deprecated("newFunc")
}
接下来(假设6个月)
oldFunc <- function()
{
.Defunct("newFunc")
}
然后又过了6个月我可以从包中删除该功能。
但是,如何删除在包中存储为/data/myData.rda
的数据对象,并且还有一些myData.Rd
描述?
答案 0 :(得分:1)
除了使用.Deprecated
和.Defunct
之外,您还应该
data/
中删除数据集。用户可以从CRAN 为了对未来的读者有所帮助,答案是原始问题下的评论摘要。
答案 1 :(得分:1)
很好的问题,很遗憾,我没有找到答案。
因此,我将分享为解决此案而起草的内容。我知道它并不完美,但是我希望它会有用和/或改进。
因此,在初稿(见下文)之后,我采用了一种似乎合理且足够好的解决方案。
第一步是将数据文件从其默认位置./data
移动到另一个位置,以避免其自动加载-即使是延迟加载。
目标位置为./data-raw
,该位置是惯例使用的目录,用于存储脚本和原始数据,以便能够更新或复制导出的数据集的产生-在{{ 3}}。
按照惯例,我使用leg_
前缀将其标记为旧数据集。
$ mv ./data/my_data.rda ./data-raw/leg_my_data.rda
用于将数据集从旧数据集转换为新格式的代码与旧数据集一起存储在./data-raw/my_data.R
中。这将使整个过程可重复。
# my_data new version
library(tidyverse)
# Load legacy data -----
load("data-raw/leg_my_data.rda")
leg_my_data <- my_data
# Create the new dataset -----
# Perform here every change that has to be performed
my_data <- leg_my_data %>%
rename(cat = categ) %>%
arrange(categ)
# Write the new dataset ----
usethis::use_data(my_data, overwrite = TRUE, compress = 'xz')
提供文件,您确定新版本已经发布!
source('./data-raw/my_data.R', echo=TRUE)
# ✓ Saving 'my_data' to 'data/my_data.rda'
# ● Document your data (see 'https://r-pkgs.org/data.html')
my_data
# A tibble: 10 x 2
# categ val
# <fct> <int>
# 1 a 9
# 2 a 6
# 3 a 4
在./R/my_package-package.R
文件中,创建一个 legacy_mode
函数。如果用户出于兼容性原因需要使用数据集,则此功能是一种方式,供用户加载数据集的先前(旧版)。
#' Load legacy version of datasets.
#'
#' Load legacy (previous) version of all the datasets for compatibility reason.
#' The environment where data will be loaded can be chosen.
#'
#' @param envdir the environment where the data should be loaded.
#' @param verbose should item names be printed during loading?
#'
#' @export
legacy_mode <- function(envdir = parent.frame(), verbose = TRUE) {
.Deprecated(msg = "This function replaces datasets with the previous (legacy) version for compatibility reason")
# TODO: To be improved to load a subset of datasets
paths <- sort(Sys.glob(c("data-raw/leg_*.rda", "data-raw/leg_*.RData")))
for (i in 1:length(paths)) {
load(paths[i], envir = envdir, verbose = verbose)
}
}
因此,现在您可以访问默认可用的数据集的新版本和出于兼容性原因而需要的旧版本。如果使用旧数据,则会显示适当弃用消息。
# The current version
head(my_data, 3)
# A tibble: 3 x 2
categ val
<fct> <int>
1 a 9
2 a 6
3 a 4
# Activation of the legacy mode
legacy_mode()
# Loading objects:
# my_data
# Warning message:
# This function replaces datasets with the previous (legacy) version for # compatibility reason
# Legacy version
head(my_data, 3)
# A tibble: 3 x 2
# cat val
# <fct> <int>
# 1 a 9
# 2 c 2
# 3 b 3
不要忘记通过更新R/my_data.R
中的数据集文档来记录更改。您可以在便笺中提及旧版模式。
注意:我也为此主题写过Data chapter of the book R packages,内容还多一些。
目标是将先前的数据移动到以dep_
为前缀的文件中。然后,新数据将替换它。
# Moving the deprecated data prefixed with dep_
dep_my_data <- my_data
usethis::use_data(dep_my_data)
# Overwriting data with the new version of the dataset
my_data <- new_data
usethis::use_data(my_data, overwrite = TRUE)
#' MyData package
#'
#' Note: this dataset is the new version. If you want to use the old one for compatibility reason,
#' please use instead \code{\link{dep_my_data}}.
#'
#' @docType data
#'
#' @rdname dep_my_data
"mydata"
#' [Deprecated] MyData package
#'
#' Note: this dataset still exist but will be removed (defunct) in the next version.
#' Please use instead \code{\link{my_data}}.
#'
#' @docType data
#'
#' @rdname dep_my_data
"dep_mydata"
> data()
# dep_mydata [Deprecated] MyData package
# mydata MyData package