我目前正在为R包编写一个函数。此函数旨在执行的部分目的是 (a( 将数据作为输入,以及 (b( 根据可接受值列表检查其一列。
这些可接受的值是从另一个组织给我的。它们位于.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
告诉我user
中哪些x
值是有效的:
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
我想通了,以防将来有人遇到这种情况。我是如何完成的,只是在函数的本地环境中从/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))
)
}
参见 Hadley Wickham 关于 R 编写包的书,其中他解释了如何在包中存储数据。
"包裹数据最常见的位置是(惊喜!数据/。此目录中的每个文件都应为 .由 save(( 创建的 RData 文件包含单个对象(与文件同名(。
这将使包名称为 :d ata 的包的任何用户都可以访问数据集。