Создать данные R с именем динамической переменной из функции для пакета? - PullRequest
1 голос
/ 24 мая 2019

Я работаю над функцией, которая является частью пакета. Этот пакет содержит шаблон для нового пакета и функцию, которая создает данные R для нового пакета, которому должно быть присвоено динамическое имя для этой функции.

На данный момент я делаю следующее:

makedata <- function(schemeName, data) {
  rdsFile <- paste0(schemeName, ".rds")
  varName <- paste0(schemeName)
  saveRDS(
    data,
    file = file.path( ".", "data", rdsFile )
  )
  cat(
    paste0(varName, " <- readRDS(\"./", rdsFile, "\")"),
    file = file.path( ".", "data", paste0(varName, ".R") )
  )
}

makedata(name = "test", data = letters)

, что приводит к двум файлам в каталоге данных:

  1. файл test.rds, содержащий letters, но который не загружается R при загрузке пакета (rds не поддерживается)

  2. файл test.R, который имеет код test <- readRDS("./test.rds") и который при загрузке пакета вызывает загрузку данных в test.rds в переменную test, которая содержит letters.

Теперь CRAN не любит файлы rds в каталоге данных.

Есть ли другой способ, которым я могу использовать стандартные форматы (предпочтительно RData) для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Возможная альтернатива с eval parse, как обсуждалось в комментариях.

makedata <- function(schemeName, data) {
  rdaFile <- paste0(schemeName, ".rda")
  fileLocation <- file.path( ".", "data", rdaFile )
  varName <- paste0(schemeName)

  assign(varName, data)
  eval(parse(text = sprintf("save(%s, file = '%s')", varName, fileLocation)))

  cat(sprintf("%s <- load(%s, file = '%s')", 
              varName, varName,
              fileLocation
              ),
      file = file.path( ".", "data", paste0(varName, ".R") ))
}

Не по теме : Кроме того, поскольку вы разрабатываете пакеты, одним из удобных вариантов может быть использование system.file вместо file.path из-за параметра system.file('data/test.R', package = 'yourPackage'), который позволяет просматривать каталог вашего пакета, где бы он ни был установлен. Не проверялось ваше предыдущее решение, оно также может работать нормально.

1 голос
/ 24 мая 2019

Вы можете попробовать что-то вроде этого:

makedata <- function(schemeName, data) {
  rdataFile <- paste0(schemeName, ".rda")
  ## Assign data to the name saved in schemeName
  assign(x = schemeName, value = data)
  ## Save as RData file
  save(list = schemeName, file = file.path( ".", "data", rdataFile))
}
...