R&;如何获取作为函数参数传递的向量中包含的符号名称?

R&;如何获取作为函数参数传递的向量中包含的符号名称?,r,quosure,R,Quosure,我想编写一个R函数arg2str,它返回作为参数输入的符号的名称(即字符串向量) 对于最简单的情况,我只有一个输入符号: library ("rlang") arg2str.v0 <- function (arg) rlang::quo_name (enquo (arg)) arg2str.v0 (a) ## [1] "a" 我如何调整我的函数来实现这一点 我的第一个直觉是首先使用sapply(而不是引用参数向量本身)引用参数向量中包含的符号,然后将rlang::quo_name应用

我想编写一个R函数
arg2str
,它返回作为参数输入的符号的名称(即字符串向量)

对于最简单的情况,我只有一个输入符号:

library ("rlang")

arg2str.v0 <- function (arg) rlang::quo_name (enquo (arg))
arg2str.v0 (a)
## [1] "a"
我如何调整我的函数来实现这一点


我的第一个直觉是首先使用
sapply
(而不是引用参数向量本身)引用参数向量中包含的符号,然后将
rlang::quo_name
应用到结果的quosure向量。但参数向量中的符号似乎是在对每个变量调用
enquote
之前在
sapply
中进行计算的:

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.v2我不确定是否有针对您所需内容的向量化tidyeval操作。你可以试试

f <- function(v) {
    v <- rlang::quo_name(enquo(v))
    gsub('^c\\(|\\s|\\)$', '', v) %>% 
        strsplit(',') %>% 
        unlist 
}

f(c(a, b, c))
#[1] "a" "b" "c"
f%
非上市
}
f(c(a、b、c))
#[1] “a”“b”“c”
这将与
a
c(a)
c(a,b)
形式的输入一起工作,但它有点粗糙


您的附带问题(为什么
arg2str.v1(a,b,c)
不在行首打印
“[1]”
)的答案是,它返回一个命名向量,其名称为空字符串(例如,与
set_names(c('a','b','c'),c(','','')的输出进行比较)
).

使用
替换
deparse
的一个可能的黑客答案:

arg2str.v3 <- function (args) {
    strs <- sapply (substitute (args), deparse)
    if (length (strs) > 1) { strs <- strs [-1] }
    return (strs)
}
arg2str.v3 (c (a, b, c))
## [1] "a" "b" "c"

使用rlang约定,这应该可以:

return_args <- function(args){

    args_expr <- enexpr(args)

    if(length(args_expr) == 1) {
        args_vars <- as.list(args_expr)
    } else {
        args_vars <- as.list(args_expr)[-1]
    }

    sapply(args_vars, quo_name)
}


return_args(c(a, b, c))
[1] "a" "b" "c"

return_args(a)
[1] "a"


return\u args试试这个:
arg2str.v0你试过你的代码了吗@Smithgoestowashington先生当然有。@Smithgoestowashington先生,我在
arg2str.v0
的矢量化版本中得到了一个类似的错误,即:
乐趣中的错误(X[[I]],…):没有找到对象“a”
确实有问题,但它确实有效!然而,它不允许命名向量作为输入,例如
f(c(n1=a,n2=b))
(我在问题中没有指定的附加功能)。我想我们可以想出一个正则表达式来获取和保存这样的名称。同时也感谢您对附带问题的回答。这很有道理!
arg2str.v3 <- function (args) {
    strs <- sapply (substitute (args), deparse)
    if (length (strs) > 1) { strs <- strs [-1] }
    return (strs)
}
arg2str.v3 (c (a, b, c))
## [1] "a" "b" "c"
arg2str.v3 (c (n1 = a, n2 = b, n3 = c))
##  n1  n2  n3 
## "a" "b" "c"
return_args <- function(args){

    args_expr <- enexpr(args)

    if(length(args_expr) == 1) {
        args_vars <- as.list(args_expr)
    } else {
        args_vars <- as.list(args_expr)[-1]
    }

    sapply(args_vars, quo_name)
}


return_args(c(a, b, c))
[1] "a" "b" "c"

return_args(a)
[1] "a"