我想简化一些生成文本的小代码。当不使用该函数时,程序的默认参数为长度为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