(R) IF 语句:如果为 FALSE,则停止并发出警告,否则继续

dez*_*000 5 unit-testing r

我正在创建一个函数,在它执行任何困难的操作之前,我需要它检查“样本”数据集中列出的所有列名称是否也存在于“网格”数据集中(该函数将一个映射到另一个) 。

all(names(samples[expvar]) %in% names(grids))
Run Code Online (Sandbox Code Playgroud)

这是这样做的:all() 中的代码询问“samples”中列的列表(“expvar”)中的所有名称是否也是“grids”中的名称。length=3正确的输出expvar将是TRUE TRUE TRUE. 'all' 询问是否全部为 TRUE,因此此处的输出为 TRUE。我想做一个 IF 语句,如下所示:

if(all(names(samples[expvar]) %in% names(grids)) = FALSE) {stop("Not all expvar column names found as column names in grids")}
Run Code Online (Sandbox Code Playgroud)

不需要别的,它会继续下去。问题是 '= FALSE' 是多余的,因为 all() 是一个逻辑上可评估的语句......是否有一个“继续”函数,例如

if(all(etc)) CARRYON else {stop("warning")}
Run Code Online (Sandbox Code Playgroud)

或者,有人能想出一种方法来重组它以使其发挥作用吗?

sha*_*ker 6

您正在寻找该功能stopifnot

但是您不需要将其实现为

if (okay) {
  # do stuff
} else {
  stop()
}
Run Code Online (Sandbox Code Playgroud)

这就是你所拥有的。相反你可以做

if (!okay) {
  stop()
}
# do stuff
Run Code Online (Sandbox Code Playgroud)

因为这些行将按顺序执行。但是,再次强调,使用 可能更具可读性stopifnot,如下所示:

stopifnot(okay)
# do stuff
Run Code Online (Sandbox Code Playgroud)


rvl*_*rvl 3

我会编码:

if(!all(...))
    stop(...)
... rest of program ...
Run Code Online (Sandbox Code Playgroud)