Как использовать данные внутри функции в пакете R?

В настоящее время я пишу функцию для пакета R. Часть того, для чего предназначена эта функция, состоит в том, чтобы (а) принимать данные в качестве входных данных и (б) сверять один из столбцов со списком допустимых значений.

Эти приемлемые значения даны мне из другой организации. Они находятся в файле.csv. То, что я хотел бы сделать, это загрузить этот файл.csv и использовать его в качестве ссылки, чтобы проверить, есть ли у столбца от пользователя допустимые значения.

Например, скажем, у пользователя есть эти данные:

set.seed(1839)
user <- data.frame(x=sample(letters,10),
                   y=rnorm(10))
user

   x          y
1  v -0.7025836
2  p -1.4586245
3  f  0.1987113
4  y  1.0544690
5  o -0.7112214
6  m  0.2956671
7  b  0.3016737
8  a -0.0945271
9  x -0.2790357
10 c  0.1681388

И.csv содержит много (полезных) столбцов, но я забочусь только об одном (z) на момент:

ref <- data.frame(z=letters[1:4], a=rnorm(4), b=(rnorm(4)))
ref

  z          a          b
1 a -0.3563105  1.4536406
2 b  1.6841862  1.3232985
3 c  1.3073516 -0.6978598
4 d  0.4352904 -0.3971175

Код, который я хотел бы запустить (примечание: я не звоню library в реальной функции я просто делаю это здесь для простоты):

library(dplyr)
valid_values <- ref %>%
  select(z) %>% 
  unname() %>% 
  unlist() %>% 
  as.character()

summary <- user %>% 
  mutate(x_valid=ifelse(x %in% valid_values, TRUE, FALSE))

summary говорит мне, какие значения x в user действительны:

   x          y x_valid
1  v -0.7025836   FALSE
2  p -1.4586245   FALSE
3  f  0.1987113   FALSE
4  y  1.0544690   FALSE
5  o -0.7112214   FALSE
6  m  0.2956671   FALSE
7  b  0.3016737    TRUE
8  a -0.0945271    TRUE
9  x -0.2790357   FALSE
10 c  0.1681388    TRUE

Теперь, что я использую, чтобы заменить ref с в моем коде функции? Где я должен хранить эти данные в моем пакете? Как мне его загрузить? И к какому типу файлов я должен это конвертировать?

Функция должна выглядеть примерно так:

x_check <- function(data) {

  # get valid values
  valid_values <- ??? %>%
    select(z) %>% 
    unname() %>% 
    unlist() %>% 
    as.character()

  # compare against valid values
  return(
    data %>% 
    mutate(x_valid=ifelse(x %in% valid_values, TRUE, FALSE))
  )
}

Что мне заменить ??? с, чтобы получить мои данные? Мне все равно, сможет ли пользователь увидеть это ref данные, которые я хочу загрузить.


я использую devtools::load_all("directory/for/my/package") проверить мою посылку. Соответствующая информация сеанса:

R version 3.4.0 (2017-04-21)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.3 (Maipo)

other attached packages:
[1] roxygen2_6.0.1             devtools_1.13.2

1 ответ

Решение

Я понял это, на случай, если кто-нибудь столкнется с этим в будущем. Как я это сделал, просто загружал данные из /data файл в локальной среде внутри функции:

x_check <- function(data) {

  # get reference data
  data("ref", envir=environment())

  # get valid values
  valid_values <- ref %>%
    select(z) %>% 
    unname() %>% 
    unlist() %>% 
    as.character()

  # compare against valid values
  return(
    data %>% 
    mutate(x_valid=ifelse(x %in% valid_values, TRUE, FALSE))
  )
}

См. Книгу Хэдли Уикхема о написании пакетов R, где он объясняет, как хранить данные в пакете.

"Самым распространенным местом для данных пакета является (сюрприз!) Data/. Каждый файл в этом каталоге должен быть файлом.RData, созданным функцией save(), содержащим единственный объект (с тем же именем, что и файл)".

Это сделает ваш набор данных доступным для любого пользователя вашего пакета с packagename::data.

Другие вопросы по тегам