【发布时间】:2019-02-06 09:56:06
【问题描述】:
我想编写一个 R 函数 arg2str,它返回作为参数输入的符号的名称(即字符串向量)。
对于最简单的情况,我只有一个输入符号:
library ("rlang")
arg2str.v0 <- function (arg) rlang::quo_name (enquo (arg))
arg2str.v0 (a)
## [1] "a"
如果我有多个符号,我可以使用三点结构:
arg2str.v1 <- function (...) sapply (enquos (...), rlang::quo_name)
arg2str.v1 (a, b, c)
##
## "a" "b" "c"
(辅助问题:为什么在这种情况下,字符串的结果向量显示为带有初步换行符而不是初步[1]?)
但我实际上想处理符号向量。然而:
sym2str.v1 (c(a, b, c))
##
## "c(a, b, c)"
如何调整我的函数来做到这一点?
我的第一个直觉是首先使用 sapply 引用参数向量中包含的符号(而不是引用参数向量本身),然后将 rlang::quo_name 应用于结果向量。但似乎参数向量中的符号在 sapply 内被评估,然后 enquote 被调用:
arg2str.v2 <- function (args) {
enquo_args <- sapply (args, enquo)
lapply (enquo_args, rlang::quo_name)
}
arg2str.v2 (c (a, b, c))
## Error in lapply(X = X, FUN = FUN, ...) : object 'a' not found
【问题讨论】:
-
试试这个:
arg2str.v0 <- Vectorize(arg2str.v0),希望对你有帮助。 -
你试过你的代码了吗? @MrSmithGoesToWashington
-
我当然做到了。
-
@MrSmithGoesToWashington,
arg2str.v0的矢量化版本出现类似错误,即:Error in FUN(X[[i]], ...) : object 'a' not found