繁体   English   中英

如何在 R 包中的函数内使用数据?

[英]How to use data within a function in an R package?

我目前正在为 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告诉我userx哪些值是有效的:

   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 编写包的书,他解释了如何在包中存储数据

“包数据最常见的位置是(惊喜!)data/。这个目录中的每个文件都应该是一个由 save() 创建的 .RData 文件,其中包含一个对象(与文件同名)。

这将使您的包的任何用户都可以使用 packagename::data 访问您的数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM