Как я могу найти сумму списка функций в R? - PullRequest
0 голосов
/ 15 сентября 2011

Итак, у меня есть список функций. Я хочу создать цикл for, который возвращает (очевидно, как функцию) их сумму.

Чтобы создать список функций внутри цикла 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.

1 Ответ

6 голосов
/ 15 сентября 2011

Как отметил Ник, «сумма функций» не имеет смысла. Я дико догадываюсь, что вы хотите оценить функцию в какой-то момент (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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...