Как использовать данные внутри функции в пакете 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.