LINUX.ORG.RU

[R][рекурсия]

 ,


0

0

Допустим, у нас есть список (имён) листов дерева t$tip.label, а также список граней t$edges (всегда от корня в сторону листа).

Список граней, это int [1:..., 1:2] (список пар вида вершина-вершина; от корня к листу).

Допустим у нас есть некая функция присвоения значений граням, которая распространяется начиная с листов к корню. Простейший пример: каждой гране присваиваем значение, соответствующее сумме значений для поддерева, растущего из этой грани.

Как это нужно реализовывать в R? Поигрался с рекурсией, но получил слишком глубокую рекурсию.

my_tip_function <- function(l)rep(1,times=length(l))
my_edge_function <- function(edges,tip.label) ifelse (is.na(tip.label[edges[,2]]),sum(my_edge_function(edges,tip.label)[sapply(edges[,2], function(x) edges[which(edges[,1]==x)])]),my_tip_function(tip.label))

Допустим:

edge=matrix(c(4,1,4,5,5,3,5,2),ncol=2,byrow=T)
tips=c('a','b','c')
my_edge_function(edge,tips)
Ошибка: исполнение расположено слишком глубоко: неопределенная рекурсия / options(expressions=)?

Что может быть не так?

★★★★

Последнее исправление: maxcom (всего исправлений: 1)

На самом деле сумма не для всего поддерева, а только для растущих из вершины рёбер.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

Набросок идеи http://omploader.org/vMWpvZw .

На самом деле, это просто пример, считать нужно совсем другое; но этот пример отражает идею распространения от вершины к корню.

Davidov ★★★★
() автор топика

>my_edge_function <- function(edges,tip.label) ifelse (is.na(tip.label[edges[,2]]),sum(my_edge_function(edges,tip.label)[sapply(edges [,2], function(x) edges[which(edges[,1]==x)])]),my_tip_function(tip.label))

я не очень понимаю, почему это должно завершиться

а каким-нить исследованием в глубину это нельзя сделать?

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

Да, я понял уже, почему оно никогда не закончится.

Интересно, как правильно это реализовать (не вычисленные элементы зависят от вычисленных.

Davidov ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.