在基础R中过载为逻辑过载

  • 本文关键字: r
  • 更新时间 :
  • 英文 :


我想简化一些生成文本的小代码。当不使用该函数时,程序的默认参数为长度为0的字符。我对比更简单的东西感兴趣

if (nchar(expr) > 0) ...

所以我创建了以下

as.logical <- function(x, ...) UseMethod("as.logical")
as.logical.default <- function (x, ...)  base::as.logical(x, ...)
as.logical.character <- function (x, ...) nchar(x) > 0

如果我在命令行中尝试一些例子,它可以

> as.logical(letters)
[1] TRUE TRUE TRUE ...

但有趣的是,cond"逻辑"向量并没有尝试应用as.logical。它似乎用于以下其他情况:

> if (1) print('Has')
[1] "Has"
> if ('Has') print(1)
Error in if ("Has") print(1) : argument is not interpretable as logical

cond是如何评估的?我不能骗它使用我的函数吗?

从源代码来看,基本的Rif语句不会对逻辑一种通用的方式。这是代码。它确实在表达式的C代码中调用了asLogical,但该版本的asLogical不执行泛型调度(因为默认的as.logical不是泛型的(。如果传入一个字符串,它将只运行LogicalFromString,该字符串只将有限数量的硬编码字符串识别为TRUE:"T"、"TRUE"、"TRUE"、"TRUE"。除非你想写某种"if"函数类型的东西(你真的不能写自己的语句(,否则没有办法改变用户空间中的这种行为。

回应Flick先生的回答,即需要包装器。这就是一个似乎可以解决问题的包装器:

newif <- function(cond, expr) {
answer <- as.logical(eval(cond))
if (answer) {
invisible(eval(expr))
}
}
> newif('Has', print(1))
[1] 1

相关内容

  • 没有找到相关文章

最新更新