如何在自定义R包中记录含双dataframe列表的复杂函数参数?
关于R包中复杂参数的文档、示例与测试方案
1. 复杂参数的文档描述方式
不用在参数的简短描述里堆砌所有列要求,分层次说明更清晰:
- 参数描述(
@param):先明确参数类型与核心结构,比如:@param linked_dfs A named list containing two tightly coupled data frames: * `main_data`: Core observation data * `meta_data`: Supplementary metadata tied to `main_data` See the *Dataframe Specifications* section for required columns and relationships. - 单独章节(
@section):在roxygen2注释里加专门的小节,详细列每个数据框的要求:@section Dataframe Specifications: The `linked_dfs` list requires two data frames with the following columns: - `main_data`: - `record_id` (character/numeric): Unique identifier for each observation (must match `meta_data$id`) - `measurement` (numeric): Quantitative measurement values - `meta_data`: - `id` (character/numeric): Matching identifier to `main_data$record_id` - `group` (factor): Categorical group assignment for observations - 补充关联逻辑:在该小节里明确二者的绑定规则(比如ID列必须一一对应,无缺失匹配),避免用户误解参数的耦合性。
2. 优质示例与测试的实现方案
示例编写
两种常见方式,按需选择:
- 内嵌小型示例数据:如果结构简单,直接在示例代码里生成,用户能直观看到参数构造过程:
# 构建示例参数 example_main <- data.frame(record_id = c(1,2,3), measurement = c(10.2, 15.7, 8.9)) example_meta <- data.frame(id = c(1,2,3), group = factor(c("A", "B", "A"))) linked_dfs <- list(main_data = example_main, meta_data = example_meta) # 调用函数 your_function(linked_dfs) - 使用data目录存储:如果参数结构复杂、需要在多个示例/测试中复用,把预定义的列表数据存到包的
data/目录下(比如保存为linked_dfs_example.rda),示例中直接加载:
这种做法在R包开发中非常常见,尤其适合需要展示真实数据结构的场景。# 加载示例参数 data(linked_dfs_example) # 调用函数 your_function(linked_dfs_example)
测试编写(基于testthat)
重点覆盖正常输入、边界情况与错误处理:
test_that("your_function works with valid linked data frames", { # 加载预定义的测试数据或临时构建 data(linked_dfs_example) result <- your_function(linked_dfs_example) # 测试输出类型/结构 expect_s3_class(result, "data.frame") expect_equal(nrow(result), 3) }) test_that("your_function throws error for mismatched IDs", { # 构造ID不匹配的错误参数 bad_meta <- data.frame(id = c(1,2,4), group = factor(c("A", "B", "A"))) bad_dfs <- list(main_data = example_main, meta_data = bad_meta) expect_error(your_function(bad_dfs), "Mismatched IDs between main and meta data") }) test_that("your_function throws error for missing required columns", { # 构造缺少列的错误参数 missing_col_main <- data.frame(record_id = c(1,2,3)) bad_dfs <- list(main_data = missing_col_main, meta_data = example_meta) expect_error(your_function(bad_dfs), "Missing required column 'measurement' in main_data") })
内容的提问来源于stack exchange,提问作者Kiek
相关产品推荐
相关产品推荐

