Переменная на самом деле слишком сильно меняется, потому что вы проверяете все операторы if на каждой итерации.
Таким образом, каждый раз cadena [i] == 'a' первый, если назначает 'q1' для edoActual, а затем, когда он достигает 3-го, если он снова становится 'q0'.
Я думаю, что вы действительно хотите проверить только первое правильное утверждение if. Поэтому, когда edoActual меняет свое значение, он переходит к следующей итерации. Вы можете сделать это, используя else, это гарантирует, что вы пройдете следующий тест, только если предыдущий был Ложным.
edoActual = "q0";
print("Input cadena: ");
cadena <- scan("", what="char");
for(i in 1:length(cadena)) {
if( edoActual == "q0" && cadena[i] == "a" ) {
edoActual = "q1";
} else if( edoActual == "q0" && cadena[i] == "b" ) {
edoActual = "q0";
} else if( edoActual == "q1" && cadena[i] == "a" ) {
edoActual = "q0";
} else if( edoActual == "q1" && cadena[i] == "b" ) {
edoActual = "q1";
} else if( cadena[i] != "a" && cadena[i] != "b") {
print("Error: invalid.");
break;
}
}
if( i == length(cadena) ) {
if(edoActual == "q1") {print("accepted (:");}
if(edoActual == "q0") {print("rejected ):");}
}