如何测试fct_na_value_to_level()函数的执行结果?
如何测试
fct_na_value_to_level()的执行结果 fct_na_value_to_level()的默认行为是将NA替换为非字符类型的NA水平,常规缺失值检测方法(如is.na()、== NA)无法识别这个特殊水平,给测试带来了困扰。以下是测试示例及问题表现:
library(forcats) library(dplyr) # 手动指定替换值为'x'的情况 letters[1:3] %>% factor %>% fct_na_value_to_level('x') #> [1] a b c #> Levels: a b c x # 默认替换为NA水平的情况 a = c("foo", "bar", NA) %>% fct_na_value_to_level() a[3] #> [1] <NA> #> Levels: bar foo <NA> a[3] %>% dput() #> structure(3L, levels = c("bar", "foo", NA), class = "factor") # 常规检测方法失效 a[3] %>% is.na() #> [1] FALSE a[3]==NA #> [1] NA a[3]=="NA" #> [1] FALSE
可行的测试方法
可以通过以下几种方式正确验证该函数的执行结果:
检查因子水平是否包含NA:直接查看
levels属性,确认NA水平是否被添加# 验证是否成功添加NA水平 expect_true(any(is.na(levels(a))))通过位置匹配特殊水平:利用因子的整数编码定位对应水平
# 验证第3个元素对应的是NA水平 expect_equal(levels(a)[a[3]], NA)对比完整因子结构:直接对比目标因子的完整结构(含水平和编码)
target <- factor(c("foo", "bar", NA), levels = c("bar", "foo", NA)) expect_identical(a, target)使用
forcats::fct_match:该函数可正确匹配包含NA的因子水平expect_true(fct_match(a[3], NA))
内容的提问来源于stack exchange,提问作者Dan Chaltiel
相关产品推荐
相关产品推荐

