2011-09-15 38 views
0

所以我有functions.I的列表要創建一個for循環,返回(顯然作爲一個函數)兩者之和。我如何找到R中函數列表的總和?

爲了創建內部的功能的列表for循環我使用此代碼

##CODE 

f=dnorm 
h=function(x){log(f(x))} 

S=c(-3,-2,-1,0,1,2,3) 
K=matrix(rep(1:length(S),2),ncol=2) 

for(i in 1:length(S)){ 
    K[i,]=c(S[i],h(S[i])) 
    } 

funcs=list() 

## LOOP TO DEFINE THE LINES 

for(i in 1:6){ 

## Make function name 
funcName <- paste('hl', i,i+1, sep = '') 

## Make function 
func1 = paste('function(x){ (K[',i,'+1,2]-K[',i,',2])/(K[',i,'+1,1]-K[',i,',1])*x+ 
K[',i,'+1,2]-((K[',i,'+1,2]-K[',i,',2])/(K[',i,'+1,1]-K[',i,',1]))*K[',i,'+1,1]}',sep 
= '') 

funcs[[funcName]] = eval(parse(text=func1)) 

} 

其產生的6層的功能的列表。我怎樣才能得到他們的總和?我嘗試過使用apply命令,但是我的語法不正確,或者它們不起作用。

P.S我實際上是想爲ARS命令寫我一個代碼。

+8

你是什麼意思的函數的總和是什麼意思?一個函數,評估它的加數的評估總和? –

+1

你能否請自然語言解釋這段代碼應該做什麼?爲什麼你需要以這種曲折的方式構建你的功能?你不能簡單地使用普通函數定義來定義函數嗎? – Andrie

+0

我不明白你想要做什麼。但是,如果你想從你的函數中獲得一個值(sum?),你必須給它們一個數值。例如:funcs $ hl12(1)返回給你4.58106。 –

回答

6

尼克指出,「功能的總和」是沒有意義的。我猜瘋狂你想在某個時候在功能評估(在S?),然後把這些值的總和。這應該做的伎倆。

rowSums(sapply(funcs, function(f) f(S))) 

很多你的代碼可以更清晰地寫,並在向量化的方式。

f <- dnorm 
h <- function(x) log(f(x)) 

S <- -3:3 
K <- cbind(S, h(S)) #No need to define this twice; no need to use a loop 

i <- seq_len(6) 
funcNames <- paste('hl', i, i+1, sep = '') #paste is vectorised 

#You can avoid using `paste`/`eval`/`parse` with this function to create the functions 
#Can possibly be done even more cleanly by using local 
makeFunc <- function(i) 
{ 
    evalq(substitute(
    function(x) 
    { 
     (K[i + 1, 2] - K[i, 2])/(K[i + 1, 1] - K[i, 1]) * x + 
     K[i + 1, 2] - 
     ((K[i + 1, 2] - K[i, 2])/(K[i + 1, 1] - K[i, 1])) * K[i + 1, 1] 
    }, 
    list(i = i) 
)) 
} 

funcs <- lapply(i, makeFunc) 
names(funcs) <- funcNames 
rowSums(sapply(funcs, function(f) f(S)))