如何将多个参数作为单个向量传递给函数?
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"
【讨论】:
以上是关于如何将多个参数作为单个向量传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章