【问题标题】:Replace the argument with a list in R [duplicate]用R中的列表替换参数[重复]
【发布时间】:2013-02-25 04:14:45
【问题描述】:

有时有一个函数有任意数量的参数。例如,闪亮包的bootstrapPage 函数。如果我有一个 data.frame 并且我想为一行创建一个小部件,那么我还没有找到一种根据 data.frame 的行号传递参数数量的漂亮方法。至此,我生成了脚本并使用了eval(parse(text="..."))的技巧

实际上,R中传递给函数的参数结构(键和值)类似于list,所以我想知道是否有办法将参数作为列表传递给R。

更具体地说,如果我有一个函数f和一个列表argv,有没有办法根据argv的名称和argv的名称匹配将argv中的对象传递给f f的参数名称,argv的位置和f的参数位置?

例如,让

f <- function(a, b) a + b
argv <- list(a=1, b=2)

我应该如何将argv 传递给与f(a=argv$a, b=argv$b) 等效的f

或者如果我们有:

f <- function(a, b, ...) { # some codes }
argv <- list(a = 1, b = 2, 3, 4, 5)

我应该如何将argv 传递给等效于f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])f

谢谢!

【问题讨论】:

    标签: r argument-passing


    【解决方案1】:

    您正在寻找do.call

    do.call(f, argv)
    

    这里有一些例子

    > args <- list(n = 10, mean = 3, sd = .5)
    > do.call(rnorm, args)
     [1] 3.589416 3.393031 2.928506 2.503925 3.316584 2.581787 2.686507 3.178877
     [9] 3.083885 2.821506
    > do.call(rnorm, list(10, 3, .5))
     [1] 3.964526 2.838760 2.436684 3.068581 1.842332 3.739046 4.050525 3.097042
     [9] 3.665041 3.535947
    > f <- function(a, b) a + b
    > argv <- list(a=1, b=2)
    > do.call(f, argv)
    [1] 3
    > f <- function(a, b, ...){print(a);print(b);print(sum(...))}
    > argv <- list(a=1,b=2, 3, 4, 5)
    > do.call(f, argv)
    [1] 1
    [1] 2
    [1] 12
    

    【讨论】:

    • 很好的例子集合。这是该语言的一个特性,在“R 简介”中确实值得更好地处理。
    • 优秀例子+1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-07-06
    • 2021-04-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多