2016-08-31 4 views
1

Я пытаюсь решить викторину с помощью R, но мой код работает неправильно. Я попробовал отладку, но кажется, что оператор ifelse не работает на определенных числах, которые кажутся довольно случайными.R: Как использовать инструкцию ifelse для вектора символов

Вот викторины: http://puzzles.nigelcoldwell.co.uk/six.htm

switches <- rep("off", 100) 
for(i in 1:100){ 
    k <- c(seq(i, 100, i)) 
    ifelse(switches[k] == "off", switches[k] <- "on", switches[k] <- "off") 
} 

Когда я запускаю этот код, я получаю "на" для 14, 22, 26, 30, 34, и т.д., в которых я должен был получить "от". Есть ли ошибка в том, как я применил инструкцию ifelse к вектору с векторизованным индексом?

ответ

1

Синтаксис ifelse должен быть

switches <- rep("off", 100) 
for(i in 1:100){ 
    k <- seq(i, 100, i) 
    switches[k] <- ifelse(switches[k] == "off", "on", "off") 
} 
+0

Когда я запускаю свой код, я получаю «on» для 1, 4, 9, 16, ... как и должно быть. Проблема в том, что я тоже получаю «на», где я не должен. Например, 14 должно быть «выключено», но оно «включено» в моем коде. Мне интересно, есть ли логический недостаток в моем коде или просто что я написал в плохом синтаксисе. – morty

+0

@MinchulShin Запустив код в моем сообщении, он дает '[1] 1 4 9 16 25 36 49 64 81 100' для значений« on » – akrun

+0

@MinchulShin Также на основе выходных данных это могут быть« переключатели [(1:10)^2] <- "on" ' – akrun

1

У вас есть бинарная проблема. Нет причин использовать ifelse. Работа с логическими значениями:

bulbs <- rep(FALSE, 100) 
for (i in 1:100) bulbs[!((1:100) %% i)] <- !bulbs[!((1:100) %% i)] 
which(bulbs) 
#[1] 1 4 9 16 25 36 49 64 81 100