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

testthat交互式运行与终端执行测试结果不一致问题咨询

R testthat 交互式环境与终端运行结果不一致问题

问题描述

  • 使用R搭配testthat做单元测试时出现异常:完全相同的测试代码,在交互式R环境、终端环境下运行结果存在差异。

复现步骤

  • 第一步:新建名为example_funcs.R的文件,写入以下代码:
function_main <- function(df, avg_gear = NA) {
  
  function_main2(df, avg_gear)
  
}

function_main2 <- function(data_df, avg_gear) {
  
  
  data_df$car_name = row.names(data_df)
  
  get_avg_gear(data_df)
  
}

# 该函数缺失对应参数传递
get_avg_gear <- function(data_df) {
  
  data_df %>%
    filter(gear == avg_gear)
  
}
  • 第二步:新建名为example.R的文件,写入以下代码:
library(dplyr)
source("example_funcs.R")

data_df = mtcars

avg_gear = median(data_df$gear)

test_that("example", {
  
  output = function_main(data_df, avg_gear = avg_gear)
  
  expect_true(
    all(output$gear == 4)
  )
  
})

不同场景运行结果

交互式R环境

在交互式R控制台执行如下命令:

testthat::test_file("example.R")

运行输出:

══ Testing example.R ═══════════════════════════════════════════════════════════════════════════════════════
[ FAIL 0 | WARN 0 | SKIP 0 | PASS 1 ] Done!

测试顺利通过。

RStudio GitBash终端

在终端执行如下命令:

Rscript -e ' testthat::test_file("example.R")'

运行输出:

══ Testing example.R ═══════════════════════════════════════════════════════════════════════════════════════════════════════════[ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ]

── Error (example.R:11:3): example ─────────────────────────────────────────────
Error in `filter(., gear == avg_gear)`: Problem while computing `..1 = gear == avg_gear`.
Caused by error:
! object 'avg_gear' not found
Backtrace:
  1. global function_main(data_df, avg_gear = avg_gear)
       at example.R:11:2
  6. dplyr:::filter.data.frame(., gear == avg_gear)
  7. dplyr:::filter_rows(.data, ..., caller_env = caller_env())
  8. dplyr:::filter_eval(dots, mask = mask, error_call = error_call)
 10. mask$eval_all_filter(dots, env_filter)

[ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ]

测试执行失败。

核心疑问

报错原因是get_avg_gear函数内未传入avg_gear参数,但按照R的词法作用域规则,变量查找逻辑应当是全局统一的:R会先在当前函数内部查找变量,之后沿函数定义所在环境逐级向上查找直到全局环境,最后在已加载的其他包中查找,理论上不应该出现两种环境下结果不一致的情况。


内容的提问来源于stack exchange,提问作者Joshua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:06:28