为何stopifnot(.packages()==c())未触发报错?
为什么
stopifnot(.packages()==c())没有触发报错? 这个问题的核心在于R的向量比较规则和stopifnot()的判断逻辑:
向量比较的循环补齐特性
.packages()返回的是一个包含17个已加载包名的字符向量,而c()是一个空向量(长度为0)。当使用==比较长度不匹配的向量时,R会对短向量进行循环补齐,但空向量循环补齐后仍然是空,因此.packages() == c()的结果是一个空逻辑向量(logical(0))。stopifnot()的判断逻辑
stopifnot()仅当传入的表达式中存在FALSE值时才会触发报错。空逻辑向量中既没有TRUE也没有FALSE,因此会被函数判定为“满足条件”,自然不会抛出错误。
验证与修正
- 直接运行
.packages() == c(),你会得到输出logical(0),确认结果是空逻辑向量。 - 要实现“当有已加载包时触发报错”的需求,正确的写法有两种:
这两种写法都会正确触发报错,因为当前环境中确实存在已加载的包。# 检查已加载包的数量是否为0 stopifnot(length(.packages()) == 0) # 用identical做严格的相等判断(推荐,避免类型隐式转换问题) stopifnot(identical(.packages(), character(0)))
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

