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")))
,但这现在似乎是一个死胡同。
一种编程替代方法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)
,因为我们不想分配NULL
to r[[i]]
(这会使 的长度减少r
1),并且我们不想不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)