2016-07-12 16 views
0

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

TakeOneIndStep <- function(Itl, N){  # Itl is a vector 
    foo <- ListMaintenance(Itl, N)  # is a vector of same length as Itl. Displays the coordinates of coalesced walks. 
    incrm <- sample(c(-1, 0, 1), size = length(Itl), replace = T, prob = c(0.25, 0.5, 0.25)) 
    for (j in 1:length(Itl)){ 
    if(Itl[j] %in% foo){ 
    Itl[j] <- (Itl[j] + incrm[j]) %% N 
    }else{ 
    Itl[j] <- "H"    # H is a "placeholder", just to indicate that that particular chain has coalesced and no longer is updated. 
    } 
} 
    return(Itl) 
} 

Ошибка на шестой строке Itl[j] <- (Itl[j] + incrm[j]) %% N.

Код для вспомогательных функций:

ListMaintenance <- function(Temp, N){ # Temp is a vector 
    rez <- CheckCoalescence(Temp) 
    fubar <- vector() 
    for(i in 1:length(rez)){ 
    for(x in 0:(N-1)){if (x %in% rez[[i]]){fubar[x] <- min(rez[[i]])} 
    } 
    } 
    return(fubar)     # output is a vector. Coordinates with the same value have the index of the smallest occurrence. 
} 

CheckCoalescence <- function(Pts){ 
    mar <- unname(split(seq_along(Pts), Pts)) 
    return(mar) 
} 

На большой картине, я пытаюсь имитировать процесс случайного блуждания с более чем двух разных отправных точек. Таким образом, аргумент Itl будет значением каждого шага в момент времени (t-1), и эта функция будет рекурсивно обновлять эти значения.

Для практических целей, я пытался проверить функцию с A <- c(0, 2, 3, 2, 6) и TakeOneIndStep(A, N = 9)

В этом случае A просто произвольный вектор. Есть больше кода для имитации прогулки, но я просто представил часть, которая вызывает ошибку.

+0

Это: 'Itl [J] <- "H"' довольно подозреваем, если идея заключается в том, что 'Itl' предполагается содержать числа. Знаете ли вы правила принуждения R? Векторы могут содержать только один тип данных. Если вы ищете «заполнителя», который не будет сжимать ваши другие ценности, возможно, попробуйте «NA»? – joran

+0

Если вам требуется значение «H», вы можете принудительно возвращать числовое значение в цикле '(as.numeric (Itl [j]) + incrm [j])' –

+0

Спасибо и @bradford adon – KirkLand

ответ

2

Проблема Itl[j] <- "H": вы меняете класс, добавляя символ к вектору. Как только цепочка объединяется в ваш код, Itl[j] больше не подходит для числовых операций.

Чтобы решить эту проблему, я заменил

Itl[j] <- (Itl[j] + incrm[j]) %% N 

с

Itl[j] <- (as.numeric(Itl[j]) + incrm[j]) %% N 

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

  • Нет связанных вопросов^_^