R&;如何获取作为函数参数传递的向量中包含的符号名称?
我想编写一个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应用
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"