如何将多个参数作为单个向量传递给函数?

Posted

技术标签:

【中文标题】如何将多个参数作为单个向量传递给函数?【英文标题】:How can I pass multiple arguments to a function as a single vector? 【发布时间】:2012-03-03 09:28:11 【问题描述】:

我用六个参数创建了以下函数:

nDone <- function(under,strike,ttoe,vol,rf,dy) 
    pnorm(((log(under/strike)+ (rf-dy+(vol^2)/2)*ttoe)/(vol*(ttoe^0.5))))


nDone(90,100,3,0.17,0.05,0)
# Result: 
[1] 0.6174643

现在我在一个对象中创建一个具有相同值的向量,并尝试使用该向量调用函数,但得到以下错误:

d <- c(90,100,3,0.17,0.05,0)

nDone(d)

Error in under/strike : 'strike' is missing

我做错了什么以及如何解决?

【问题讨论】:

谢谢,是的,这是一个更好的标题。 【参考方案1】:

试试这个

 do.call(nDone, as.list(d))

来自 cmets 的 @joran 对您第一次尝试中发生的情况的解释:

R 看到你将一个参数传递给nDone,即向量d,它被传递给第一个函数参数under。由于您没有为其他人指定默认值,因此它们丢失了,因此出现错误

【讨论】:

我在这里,输入了一个很长的解释! ;) 我要在这段代码中添加的部分内容是:R 看到您将单个参数传递给nDone,即向量d,它被传递给第一个函数参数under。由于您没有为其他人指定默认值,因此它们丢失了,因此出现错误。 对不起——我的回答风格已经被 R-help 彻底破坏了。【参考方案2】:

也许值得补充:

如果您的函数可以接受长度大于 1 的向量的参数并生成相同长度的输出,do.call 也可以处理,您将需要list()

x <- c("a", "b", "c")
y <- c(1, 2, 3)

> do.call(paste0,c(list(x),list(y)))
[1] "a1" "b2" "c3"

注意这不会失败或警告长度不等的向量:

x <- c("a", "b")

> do.call(paste0,c(list(x),list(y)))
[1] "a1" "b2" "a3"

当然paste0(x,y) 也可以在这里工作,但我正在使用它,例如对于rgb()

# whichever complex functions to generate vector of floats:
x <- seq(1,6) %>% exp()

# rescale for rgb
x <- scales::rescale(x)

# make a list of vectors
# note that as.list() would not give the desired output here
x <- rep(list(x),3)

# call
> do.call(rgb, x)
[1] "#000000" "#030303" "#0B0B0B" "#212121" "#5D5D5D" "#FFFFFF"

或整齐的一行:

> seq(1,6) %>% exp() %>% scales::rescale() %>% list() %>% rep(3) %>% do.call(rgb,.)
[1] "#000000" "#030303" "#0B0B0B" "#212121" "#5D5D5D" "#FFFFFF"

【讨论】:

以上是关于如何将多个参数作为单个向量传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量的一部分作为函数参数传递?

如何将向量传递给函数?

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

如何使用向量将多个字符串传递给函数

如何将向量传递给函数参数(我需要指针吗?)

如何将多个值传递给存储过程中的单个参数