You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义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),示例中直接加载:
    # 加载示例参数
    data(linked_dfs_example)
    
    # 调用函数
    your_function(linked_dfs_example)
    
    这种做法在R包开发中非常常见,尤其适合需要展示真实数据结构的场景。

测试编写(基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:53:14