我想寫一個函數來創建和返回一組參數,以便在我創建的函數mySimulation
中使用。到現在爲止,我基本上在做,例如,mySimulation(parm1 = 3, parm2 = 4)
。現在這是不理想的,因爲(1)在實際版本中,參數的數量變得很笨重,(2)我想跟蹤生成我正在使用的不同模型的參數的不同組合。所以,我寫了createParms
(下面顯示的最低版本)來完成這個技巧。儘管我的整個方法看起來很笨重。所有的統計學家都使用R,我相信有一個更加標準的方法來處理我的問題......對吧?寫一個函數來初始化R/Splus中的參數
createParms <- function(model = "default", ...) {
# Returns a list `parms` of parameters which will then be used in
# mySimultation(parms)
#
# Args:
# model: ["default" | "mymodel"] character string representation of a model
# with known parameters
# ...: parameters of the existing `model` to overwrite.
# if nothing is supplied then the model parameters will be left as is.
# passed variables must be named.
# e.g., `parm1 = 10, parm2 = 20` is good. `10, 20` is bad.
#
# Returns:
# parms: a list of parameters to be used in mySimulation(parms)
#
parms.names <- c("parm1", "parm2")
parms <- vector(mode = "list", length = length(parms.names))
names(parms) <- parms.names
overwrite <- list(...)
overwrite.names <- names(overwrite)
if (model == "default") {
parms$parm1 <- 0
parms$parm2 <- 0
} else if (model == "mymodel") {
parms$parm1 <- 1
parms$parm2 <- 2
}
if (length(overwrite) != 0) {
parms[overwrite.names] <- overwrite
}
return(parms)
}
非常有幫助!已編輯我的功能以反映您的更正。一個後續問題:我從來沒有理解過使用「do.call」。在這種情況下,我想爲什麼不只是'mySimulation(createParms())'。但是在這種情況下'do.call'的優點是我不需要編輯'mySimulation'來處理參數'parms'的列表。它仍然可以按原樣工作......我是否理解這個權利? – lowndrul 2011-04-18 15:32:30
@brianjd:你已經理解正確;看我的編輯。 – 2011-04-18 16:47:35