在R包的/inst中存储复杂的文件结构

iyfjxgzm  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(107)

我正在为AT/Bluesky做一个R package,我正在尝试一种非传统的结构。由于Bluesky方法通过JSON lexicon defined here以非常精确的细节进行了记录,因此我将这些文件复制到/inst目录中,因此我的包结构如下所示:

├── DESCRIPTION
├── LICENSE
├── LICENSE.md
├── NAMESPACE
├── R
│   ├── bluesky.R
│   ├── helpers.R
│   ├── lexicon.R
│   └── types.R
├── README.Rmd
├── README.md
├── blueRsky.Rproj
├── inst
│   └── lexicons
│       ├── app
│       │   └── bsky
│       │       ├── actor
│       │       │   ├── defs.json
│       │       │   ├── getProfile.json
│       │       │   ├── getProfiles.json
│       │       │   ├── getSuggestions.json
│       │       │   ├── profile.json
│       │       │   ├── searchActors.json
│       │       │   └── searchActorsTypeahead.json
│       │       ├── embed
│       │       │   ├── external.json
│       │       │   ├── images.json
│       │       │   ├── record.json
│       │       │   └── recordWithMedia.json
│       │       ├── feed
│       │       │   ├── defs.json
│       │       │   ├── getAuthorFeed.json
│       │       │   ├── getLikes.json
│       │       │   ├── getPostThread.json
│       │       │   ├── getPosts.json
│       │       │   ├── getRepostedBy.json
│       │       │   ├── getTimeline.json
│       │       │   ├── like.json
│       │       │   ├── post.json
│       │       │   └── repost.json
│       │       ├── graph
│       │       │   ├── follow.json
│       │       │   ├── getFollowers.json
│       │       │   ├── getFollows.json
│       │       │   ├── getMutes.json
│       │       │   ├── muteActor.json
│       │       │   └── unmuteActor.json
│       │       ├── notification
│       │       │   ├── getUnreadCount.json
│       │       │   ├── listNotifications.json
│       │       │   └── updateSeen.json
│       │       ├── richtext
│       │       │   └── facet.json
│       │       └── unspecced
│       │           └── getPopular.json
│       └── com
├── man
│   ├── bsky_get_profile.Rd
│   ├── bsky_get_session.Rd
│   ├── bsky_get_timeline.Rd
│   └── bsky_search_actors.Rd
└── tests
    ├── testthat
    │   └── test-lexicon.R
    └── testthat.R

我有一些函数可以查找Lexicon模式,例如

load_schema <- function(id) {
  loc <- c("lexicons", strsplit(id, "\\.")[[1]]) |>
    paste0(collapse = "/") |>
    paste0(".json")

  file_path <- system.file(loc, package = "blueRsky", mustWork = FALSE)
  cat("file_path:", file_path, "\n")
  if (!file.exists(file_path)) {
    stop(paste("Schema", id, "not found"))
  }

  jsonlite::read_json(system.file(loc, package = "blueRsky", mustWork = TRUE))
}

这非常好,因为它允许我抽象出许多用于构造请求的样板文件。
这在本地工作得很好,我可以安装这个包,我所有的测试都通过了,但是它没有通过R CMD CHECK。我相信原因是R CMD CHECK正在从词典目录中删除一些文件。输出显示:

── R CMD build ──────────────────────────────────────────────────────────────────
✔  checking for file ‘/Users/colinfraser/projects/blueRsky/DESCRIPTION’ ...
─  preparing ‘blueRsky’: (1.1s)
✔  checking DESCRIPTION meta-information ...
─  checking for LF line-endings in source and make files and shell scripts (346ms)
─  checking for empty or unneeded directories
   Removed empty directory ‘blueRsky/inst/lexicons/com’
─  building ‘blueRsky_0.0.0.9000.tar.gz’

删除空目录'blueRsky/inst/lexicons/com'

这并不好,因为实际上该目录不是空的,它只是有嵌套的文件夹。然后它失败了,因为它无法加载包代码。
我可以做些什么来阻止R CMD CHECK删除此文件?还是有什么别的问题我知道这是一个有点不寻常的包结构,但它似乎会工作得很好,如果我能让它工作。

2w3kk1z5

2w3kk1z51#

R删除了目录inst/com/,因为 * 在构建包时 * 它被认为是空的。R无法知道您计划稍后将文件存储在那里;它只是看到一个空目录,并旨在清理东西,使一个整洁的包没有任何绒毛。
解决这个问题的办法是:将一个文件放入目录中,可能是inst/com/README.md,或者,最低限度是一个零字节占位符

$ touch inst/com/.keep.this.directory

假设你的操作系统有touch二进制文件。

7rfyedvj

7rfyedvj2#

虽然Dirk E.在评论中提供了一个合适的答案,但我建议您 * 不要 * 将所有数据都包含在您的包中。相反,您可以将数据上传到GitHub存储库,并在稍后阶段提供下载此数据的功能。
如果这些数据对于您的软件包的运行是必需的,请考虑在您的zzz.R中或在加载软件包时检查这些数据,并向用户提供下载数据的说明。

相关问题