如何在不使用 alist 的情况下生成没有默认值的配对列表?

104*_*ica 4 r metaprogramming s-expression

我正在尝试对 R 代码进行简单操作,并尝试生成一个相当于

substitute(function(x) x)
Run Code Online (Sandbox Code Playgroud)

我知道我可以围绕这些事情做一些事情

as.call(list(as.symbol("function"), as.pairlist(alist(x=)), as.symbol("x")))

Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种as.pairlist(alist(x=))无需求助的方法alist,或者如果不可能的话,允许我生成等效的表达式,而无需对事物进行硬编码或解析字符串。

我正在修补诸如 之类的东西as.call(list(as.symbol("="), as.symbol("x"))),但这现在似乎是一个死胡同。

Mik*_*gan 5

一种编程替代方法as.pairlist(alist(...))是初始化一个正长度的对列表,然后分配名称(好吧,“标签”)和值:

zzz <- vector("pairlist", 1L)
names(zzz) <- "x"
zzz[[1L]] <- substitute()

identical(zzz, as.pairlist(alist(x = )))
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

更普遍:

pl <- function(n, tags, values) {
    r <- vector("pairlist", n)
    if (n >= 1L) {
        names(r) <- tags
        for (i in seq_len(n)) {
            v <- values[[i]]
            if (missing(v) || !is.null(v))
                r[[i]] <- values[[i]]
        }
    }
    r
}

identical(pl(3L, c("x", "y", "z"), list(substitute(), 0, NULL)),
          as.pairlist(alist(x = , y = 0, z = NULL)))
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

我们n >= 1L以零长度对列表为条件,NULL并且向其分配名称或值NULL是一个错误。

我们以 on 为条件missing(v) || !is.null(v),因为我们不想分配NULLto r[[i]](这会使 的长度减少r1),并且我们不想不is.null带参数地调用:

v <- substitute()
missing(v)
## [1] TRUE
is.null(v)
## Error: argument "v" is missing, with no default
Run Code Online (Sandbox Code Playgroud)