1

Я хочу сделать условную cumsum. Первоначально я думал, что могу использовать функцию «Уменьшить», но я не смог. Для того, чтобы четко объяснить:R - преобразование рекурсивного кода в функциональное программирование

a <- rep(1,5) 
b <- rnorm(n=5,mean=0.5) 
c <- rep(2,5) 
d <- rep(0.5,5) 

Reduce('+', a, init=200 , accumulate=TRUE) 

Результаты в

[1] 200 201 202 203 204 205 

Это так же, как простой cumsum. Но то, что я на самом деле хочу это условное cumsum:

Рекурсия определяется как:.

x0 = 200 
index = 0 

function (x) { 
    index = index + 1 
    if(x is between 200 and 202) return x + a[index] 
    else if(x is between 202 and 204) return x + b[index] 
    else if(x is between 204 and 206) return x + c[index] 
    else return x + d[index] 

} 

Ожидаемый результат может быть что-то вроде этого (конечно, никогда не будет таким же, из-за хаотичности

[1] 200 201 202.3 203.8 204.1 205 

Для тех, кому интересно, то ответ можно найти здесь: Convert simple recursive relation to functional program

Я могу» t, похоже, нашел способ отметить этот вопрос, так как закрыт, так как модераторы продолжают удалять все, что я добавляю, не предлагая правильный способ закрыть.

+0

Я не понимаю, как это рекурсия? Также ваш пример должен быть более понятным. В качестве примера также укажите точный желаемый результат. Не просто описывайте это. –

+0

Я уточнил рекурсию, поместив ее в формат функции. Разумеется, нет четкого «ожидаемого ответа», потому что есть случайность. Я могу, возможно, сделать это более ясным, используя некоторые фиксированные значения, если вам нравится, но я не хочу, чтобы читатели отвечали с использованием фиксированной математической формулы, я хочу понять, как это сделать, используя функции более высокого порядка. – user1480926

+1

@ user1480926 Я не думаю, что это работа для Сокращения. Сначала вы не можете дать матрицу для уменьшения. Вы можете просто указать вектор (возможно, вы можете создать вектор, в котором вы будете чередоваться между a и b). Вторая ваша индексная переменная должна быть глобальной, что-то вроде «index << - index + 1' ... – agstudy

ответ

2

Я не думаю, что вам нужно Reduce здесь. Вот пример того, что объяснить использование случай Reduce:

Reduce(paste,list(1:3,letters[1:3],LETTERS[1:3])) 
[1] "1 a A" "2 b B" "3 c C" 

Я думаю, что вы пытаетесь сделать Xan быть сделано с помощью ifelse, это векторизация. Здесь, например, условная кумулятивная сумма a и b, начиная с значения init.

a <- rep(1,5) 
b <- rep(0.01,5) 
init <- 200 
x <- seq_along(a) 
cumsum(c(init,ifelse(x %% 2 ,a[x], b[x]))) 
[1] 200.00 201.00 201.01 202.01 202.02 203.02 

Конечно, если у вас есть несколько условие:

  • Использование множественного условие: x %% 2 & x^2 < 5
  • Использование вложенных ifelse: ifelse(x %% 2 ,ifelse(x^2 <2, a[x], b[x]),1)
+0

Вы можете увидеть мое обновление. – agstudy

+0

hi agstudy, что было бы чистым способом сделать это для большего количества ifs. Например: if {a} elseif {b} elseif {c} else {d}? и больше опций, отличных от [x] b [x] (например, если у меня есть ac [x], d [x]? – user1480926

+0

@ user1480926 Добавьте условие в псевдокод к вашему OP, я помогу его написать. – agstudy

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