Вопрос для передачи объекта - PullRequest
1 голос
/ 17 октября 2011

Я новичок в "R", и у меня проблема с изменением переменной. Вот мой код:

recursiveCall <- function(x, N)
{
    x[2^(N-1)+1] <- x[2^(N-1)+1] + (x[1] + x[2^N+1] ) / 2 
    if (N>1) {
        recursiveCall(x[1..2^(N-1)+1], N-1)
        recursiveCall(x[2^(N-1)+1..N], N-1)
    }
    #cat("Wmodif = ", x, "\n")
}
PaulLevyBrownianMotion <- function(N)
{
    cat("Paul Levy construction for N = ", N, "\n")
    W = rnorm(2^N+1, 0, 1)
    W[1] <- 0
    cat("Wstandard = ", W, "\n")
    recursiveCall(W, N)
    return (W) 
}

Но W не помнит изменения в последующем рекурсивном вызове. Что я должен написать, чтобы вторая строка была похожа на третью в выводе? Также, если у вас есть предложения по поводу моего кода, я буду рад их услышать.

Вот что я пытаюсь сделать с первым ответом:

recursiveCall <- function(x, N)
{
    x[2^(N-1)+1] <- x[2^(N-1)+1] + (x[1] + x[2^N+1] ) / 2 
    if (N>1) {
        x[1:2^(N-1)+1] <- [recursiveCall(x[1:2^(N-1)+1], N-1)
        x[2^(N-1)+1:2^N] <- recursiveCall(x[2^(N-1)+1:2^N], N-1)
    }
    #cat("Wmodif = ", x, "\n")
    return x
}
PaulLevyBrownianMotion <- function(N)
{
    cat("Paul Levy construction for N = ", N, "\n")
    W = rnorm(2^N+1, 0, 1)
    W[1] <- 0
    cat("Wstandard = ", W, "\n")
    W <- recursiveCall(W, N)
    return (W) 
}

Спасибо, Нильс

1 Ответ

2 голосов
/ 17 октября 2011

Аргументы передаются по значению в R (это еще не все, но это будет работать как учебник для начинающих). Таким образом, изменение их внутри функции не меняет их «внешнюю» версию. Для того, что вы хотите, изменить

recursiveCall <- function(x, N)
{
    x[2^(N-1)+1] <- x[2^(N-1)+1] + (x[1] + x[2^N+1] ) / 2 
    cat("Wmodif = ", x, "\n")
    return(x)
}

И затем вы используете это как:

PaulLevyBrownianMotion <- function(N)
{
    cat("Paul Levy construction for N = ", N, "\n")
    W = rnorm(2^N+1, 0, 1)
    W[1] <- 0
    cat("Wstandard = ", W, "\n")
    W<-recursiveCall(W, N)
    return (W) 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...