2014-01-10 86 views
0

我在使用基本SIR模型作爲動機的介紹生物課程中教授R編程。在學生獲得基本模型後,我希望他們改變參數以查看這會如何改變感染動態。下面的代碼工作,但返回相同的命名爲「dmatrix」每次運行:是否可以傳遞一個函數來使用一個字符串來創建一個全局矩陣?

function(steps,pop,IR,RR){ 
idmatrix <- matrix(c(seq(1,steps),rep.int(0,steps*4)),nrow=steps,ncol=5) 
StoI <- function(x,y,z) {x*y*z} 
ItoR <- function(z,r) {z*r} 
idmatrix[1,2] <- pop - 1 
idmatrix[1,3] <- 1 
for (i in 2:steps){ 
deltaS <- StoI(IR,idmatrix[i-1,2],idmatrix[i-1,3]) 
deltaI <- ItoR(idmatrix[i-1,3],RR) 
idmatrix[i,2] <- idmatrix[i-1,2] - deltaS 
idmatrix[i,3] <- idmatrix[i-1,3] + deltaS - deltaI 
idmatrix[i,4] <- idmatrix[i-1,4] + deltaI 
idmatrix[i,5] <- idmatrix[i,2] + idmatrix[i,3] + idmatrix[i,4] 
} 
dmatrix <<- idmatrix 
} 

我想添加如下傳遞「runSIR」用於創建輸出矩陣字符串的選項:

function(output_matrix,steps,pop,IR,RR){ 
... 
output_matrix <<- idmatrix 
} 

我探索瞭如何讓'output_matrix'被識別爲一個字符串,但是我找不到一種方法來實現它作爲新矩陣的名稱。這可能嗎?

謝謝! -Kevin

+0

看看'?assign' –

回答

2

只需從函數返回矩陣,然後在提示符下執行賦值。

infection = function(steps,pop,IR,RR){ 
... 
return(idmatrix) 
} 

那麼它:

model1 = infection(1000, 10, 0.4, 0.1) 
model2 = infection(1000, 10, 0.5, 0.2) 

然後比較model1model2對象。

+0

優秀 - 這有助於我理解更多的R ethos – user3182472

1

鑑於你的功能:

f <- function(output_matrix,steps,pop,IR,RR){ 
... 
assign(output_matrix, idmatrix, envir=.GlobalEnv) 
} 

應該這樣做。您需要指定GlobalEnv或在該函數的範圍內創建的變量,然後立即從內存中移除。

這種技術被稱爲「無聲加載」,並在R的其他地方使用,例如,在quantmod包中的getSymbols(...)中。

+1

創建這樣的事情很奇怪。如果你的函數只創建一件事,把它作爲返回值返回並在命令行創建它。當然'x = sqrt(2)'比'sqrt(2,「x」)'更好? – Spacedman

+0

@Spacedman - 請參閱上面的編輯 – jlhoward

+4

僅僅因爲它在其他地方使用,對於典型用戶來說,它並不是一個好主意,它以默認方式從函數返回輸出 – Dason

相關問題