我正在创建一个函数,在它执行任何困难的操作之前,我需要它检查“样本”数据集中列出的所有列名称是否也存在于“网格”数据集中(该函数将一个映射到另一个) 。
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)
或者,有人能想出一种方法来重组它以使其发挥作用吗?
您正在寻找该功能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)