将具有相同名称的额外(点)参数传递给不同的内部函数

Pass extra (dots) arguments with same name to different internal functions

提问人:Dan Adams 提问时间:11/4/2022 最后编辑:Dan Adams 更新时间:11/5/2022 访问量:60

问:

假设我有一个函数,它在内部调用不同的函数,这两个函数恰好都采用名称为 的参数。在某些情况下,我想把我的论点发送给一个,有时是另一个。有没有办法在调用 f() 时指定我的意思是哪一个?f(...)color...

下面是一个简单的示例。

library(ggplot2)

f <- function(...) {
  ggplot(mtcars, aes(disp, mpg)) +
    geom_point(aes(...), ...)
}

# in this case I want it OUTSIDE aes()
f(color = "blue") # should be geom_point(color = blue)


# here I want it INSIDE aes()
f(color = cyl) # should be geom_point(aes(color = cyl))
#> Error in list2(na.rm = na.rm, ...): object 'cyl' not found

创建于 2022-11-04 使用 reprex v2.0.2

r 函数 参数传递

评论

5赞 Oliver 11/4/2022
它在您的第一个示例中并没有真正起作用 它之所以有效,只是因为它本身不会返回错误,而是创建一个级别因子,然后通过 中的默认行为在外部级别中被覆盖。你自己如何区分这两者?两者之间没有命名差异,因此您必须捕获输入,测试是否包含或包含,以及它是否包含在中,然后分别将其传递到正确的图层。aes(col = 'abc')color = 'abc'geom_pointcolorcolour.data
2赞 MrFlick 11/4/2022
可能的重复项:stackoverflow.com/questions/4124900/....所有东西都放在一个桶里。如果你有一个不同参数名称的列表,你可以以一种混乱的方式手动拆分它们,但如果它们都有相同的参数名称,那么可能不是传递参数的最佳方式。......
0赞 Dan Adams 11/5/2022
感谢@Oliver解释这里发生的事情。正如两条评论所表明的那样,这听起来从根本上是错误的处理方式。我将调整我的问题并添加一个答案,以提供结束。

答:

1赞 Dan Adams #1

首先,在同一函数中提供两个同名的不同函数参数必然是模棱两可的。因此,使用可能不是最好的方法。可以在线程中找到可能的解决方案。...

在此示例中,参数从 BOTH 传递给 BOTH,因为它们都接受一个参数。第一个示例之所以有效,是因为在两个地方都提供不会引发错误。color...aes()geom_point()colorcolor = "blue"

library(ggplot2)

ggplot(mtcars, aes(disp, mpg)) +
  geom_point(aes(color = "blue"), color = "blue")

创建于 2022-11-04 使用 reprex v2.0.2

最后,通过对原始函数进行小幅调整,可以灵活地提供给函数的任一部分,但该方法可能不会超出这个狭窄的用例,因此可能不会有太大帮助。color

library(ggplot2)

f <- function(...) {
  ggplot(mtcars, aes(disp, mpg)) +
    geom_point(...)
}

f(color = "blue")

f(aes(color = factor(cyl)))

创建于 2022-11-04 使用 reprex v2.0.2