r - "call"中空参数的表示

标签 r reflection argument-passing

什么样的动物是空话?考虑下面的一段代码。

> f <- function(...) match.call()
> l <- as.list(f(,3))
> l
[[1]]
f

[[2]]


[[3]]
[1] 3

> typeof(l[[2]])
[1] "symbol"

> identical(l[[2]],``)
Error: attempt to use zero-length variable name

> as.character(l[[2]])
[1] ""

那是什么法宝?

最佳答案

如果看起来像 l[[2]]的值是一个特殊的对象:空符号。关于空符号的一些事实(根据随意实验推测)。

(1) 空符号是一个符号:

> is.symbol(l[[2]])
[1] TRUE

(2) 不能显式创建空符号:
> as.name("")
Error in as.name("") : attempt to use zero-length variable name
> ``
Error: attempt to use zero-length variable name
> quote()
Error in quote() : 0 arguments passed to 'quote' which requires 1

(3) 创建空符号的唯一方法是通过 quote -ing 函数调用并传递一个空参数,例如:
> c <- quote(f(,0))
> d <- quote(f(x, n=, 0))

现在可以这样访问空符号:c[[2]] , d$n , as.list(d)[[3]]
(4) 空值是唯一的,不等于任何其他符号:
> identical(c[[2]], d$n)
[1] TRUE

> identical(c[[2]], `a`)
[1] FALSE

(5) 空符号不能分配给独立变量。如果分配给这样的变量,该变量实际上被分配了“缺少的参数”值:
> x <- d$n
> missing(x)
[1] TRUE
> missing(d$n)
Error in missing(d$n) : invalid use of 'missing'

但是,可以将空符号分配给列表槽:
> p <- list(`a`, k=`b`)
> p[[1]] <- d$n
> p$k <- c[[2]]

> identical(p[[1]], d$n)
[1] TRUE

> identical(p[[1]], p[[2]])
[1] TRUE

它可以作为函数参数传递:
> h <- function(x) identical("", d$n)
> h(c[[2]])
[1] TRUE

当作为函数参数传递时,该参数不被认为是缺失的:
> h2 <- function(x) missing(x)
> h2(c[[2]])
[1] FALSE

但比较
> h2(x)
[1] TRUE

(6) 空符号的字符值为空字符串:
> identical("", as.character(d$n))
[1] TRUE

(7) 没有检查值是否为空符号的原始函数。要检查一个值是否为空符号,需要将其字符表示与空字符串进行比较:
> is.symbol(d$n) && identical("", as.character(d$n))
[1] TRUE

附录

下面是一些函数定义,以方便创建和识别空符号和“缺少参数”对象。
> isEmptySymbol
function(x) is.symbol(x) && identical("", as.character(x))

> EmptySymbol
function() (quote(f(,)))[[2]]

> isMissingArgObject
function(x) {
if ("x" %in% names(match.call())) return (missing(x))
stop("An argument must be supplied.") }

> MissingArgObject
function() quote(expr=)

关于r - "call"中空参数的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20904827/

相关文章:

batch-file - 在批处理文件中获取多个参数

python - boost python的指针参数

performance - LLVM 中的参数转发

r - 在for循环中生成序列

r - 如果满足条件,则复制前一行

scala - 在 Scala 中,是否可以实例化泛型类型 T 的对象?

C# 反射 SetValue() 找不到设置访问器

c# - 有typeof的逆运算吗?

html - 在 R 中抓取 html 表及其 href 链接

r - 将邮政编码映射到 R 中各自的城市和州?