2013-04-30 2 views
0

Я пытаюсь создать функцию, которая автоматически создает многочлены объекта zoo. Исходя из Python, типичным способом является создание списка вне цикла for, а затем добавление списка внутри цикла. После этого я написал код, приведенный ниже в R:Использование merge.zoo для динамического создания переменных в R

library("zoo") 

example<-zoo(2:8) 

polynomial<-function(data, name, poly) { 

##creating the catcher object that the polynomials will be attached to 
returner<-data 

##running the loop 
for (i in 2:poly) { 

#creating the polynomial 
    poly<-data^i 
    ##print(paste(name, i), poly) ##done to confirm that paste worked correctly## 

##appending the returner object 
merge.zoo(returner, assign(paste(name, i), poly)) 
} 
return(returner) 
} 

#run the function 
output<-polynomial(example, "example", 4) 

Однако, когда я запускаю функцию, R не выбрасывает никаких исключений, но объект вывода не имеет каких-либо дополнительных данных сверх того, что я первоначально создан в example зоопарке объект. Я подозреваю, что я недопонимаю merge.zoo или, возможно, теперь разрешено динамически переназначать имена полиномов внутри цикла.

Мысли?

+0

Попробуйте это: 'ANS <- do.call (слияние, lapply (1: 4, функция (я) пример^я))' или это: 'ANS <- зоопарка (поли (например, 4, raw = TRUE), время (пример)) 'или это:' z <- lag (пример, rep (0, 4)); ans <- z^col (z) '. В каждом случае следуйте за ним, задав имена: 'names (ans) <- 1: 4'. –

ответ

0

Что касается ошибок в коде, вам не хватает присваивания результата от merge.zoo до returner. Однако, я думаю, что есть лучший способ добиться того, чего вы хотите.

example <- zoo(2:8) 

polynomial <- function(data, name, poly) { 

    res <- zoo(sapply(1:poly, function(i) data^i)) 
    names(res) <- paste(name, 1:4) 
    return(res) 
} 

polynomial(example, "example", 4) 
## example 1 example 2 example 3 example 4 
## 1   2   4   8  16 
## 2   3   9  27  81 
## 3   4  16  64  256 
## 4   5  25  125  625 
## 5   6  36  216  1296 
## 6   7  49  343  2401 
## 7   8  64  512  4096 
+0

Спасибо! Мне нужно будет немного почитать в 'sapply', но это работает как шарм. – Bryan

Смежные вопросы