2013-10-01 3 views
2

Имея вектор x, мне нужно его рекурсивно изменить во внутренней функции. Вот моя реализация этого где я ма с использованием <<- глобального оператора присваивания:Рекурсивная функция без использования << - присвоение?

outer <- function(){ 
    x <- rep(1,5) 
    inner <- function(i){ 
    if(i> length(x))return(x) 
    x[i] <<- 2 ## don't work with <- 
    inner(i+1) 
    } 
    inner(1) 
} 
outer() 
[1] 2 2 2 2 2 

Мой вопрос, если есть другой/лучше реализацию, избежать использования <<-? Обратите внимание, что я не хочу заменять рекурсию, но просто спросить, есть ли лучший/более безопасный дизайн?

+0

Как насчет 'x [i] <- inner (i)' и убедитесь, что 'inner' возвращает то, что вы хотите? oops - Я вижу, что этого недостаточно, если вы действительно хотите что-то сделать с помощью 'x', так как прямо сейчас он не возвращается из' outer' –

+0

@CarlWitthoft спасибо! Ваша «внутренняя» все еще является «рекурсивной функцией»? – agstudy

+0

Если я запускаю только ваш 'inner' с помощью' x [i] <- 2', я успешно получаю обновленные значения 'x' в среде консоли. Поэтому я думаю, что все, что вам нужно сделать, это «внешний» возврат 'x' для вас. –

ответ

3

Провод x как параметр?

outer <- function(){ 
    x <- rep(1,5) 
    inner <- function(i,x){ 
    if(i> length(x))return(x) 
    x[i] <- 2 
    inner(i+1,x) 
    } 
    inner(1,x) 
} 
outer() 
#[1] 2 2 2 2 2 
+0

См., Я ** знал ** Я был на правильном пути :-) –

+0

@Roland благодарит, но на самом деле мой настоящий x - большая матрица, так что копирование много раз (глубина рекурсии) снизит производительность, не так ли? – agstudy

+0

Мне очень хотелось бы найти возможности избежать рекурсии в Р. – Roland

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