gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:57:48 24 4
gpt4 key购买 nike

我想编写一个 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 到 quosures 的结果向量。但似乎参数向量中的符号在 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

最佳答案

使用 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"

关于R&quosures - 如何获取作为函数参数传递的向量中包含的符号名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52114227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com