使用deparse和substitute对省略号进行操作,以获取参数名称

3

如何获得函数调用中省略号所使用的参数名称,无论它们是否被打包到列表中?

如果参数直接传递给函数,以下函数效果很好。

foo <- function(...) {
  sapply(substitute(...()), deparse)
}

a <- 1:3
b <- 2:6
foo(a, b)

result: "a" "b"

现在我将参数显式地打包成列表,以使我的代码更加易于管道操作:
foo(list(a, b))

result: "list(a, b)"

函数foo也应该能够使用它来仅返回a和b的名称。如何在函数foo内处理这个问题?提前感谢您。

你是否总是在调用多个变量时计划使用 list() 函数?例如,你从不想使用 x <- list(a, b); foo(x) 吗?试图进行需要非标准评估的操作而没有更多编程交互的替代方案通常会导致以后头疼的情况。 - MrFlick
原则上,我完全同意你的观点。我通常设计清晰的接口,以便后续不会出现麻烦。然而,如果省略号是函数的第一个参数,我也希望能够支持使用管道的方式调用该函数。在这种情况下,我认为列表是最简单的方式。 - stschn
我假设你只是针对本地管道 |> 而不是 %>%?因为使用后者,您无法将未评估的符号传递给管道。list(a,b) |> foo()list(a,b) %>% foo() 是完全不同的。 - MrFlick
是的!考虑到管道友好型的使用方式,可以帮助我以非常聪明的方式处理相同的情况。 - stschn
1个回答

3

作为一种解决方法,请尝试这样做。

foo <- function(...) {
    x <- substitute(...())
    if(class(x[[1]]) == "call")  sapply(x[[1]][-1] , deparse)
    else sapply(x , deparse)
}

  • 输出
> foo(list(a, b))
[1] "a" "b"

> foo(a, b)
[1] "a" "b"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接