Это происходит потому, что , если в R использует первичный объектный класс, в вашем примере первичным объектом является список, а не их содержимое, когда вы используете as.logical, внутренние значения преобразуются в логическое возвращение массив.
a = list(x = 1, y = 0)
as.logical(a) # TRUE FALSE
Только если значение первичного объекта является числовым или некоторые специальные строки могут быть преобразованы в логические по умолчанию.
if("true") "ok" # ok
if(-1) "ok" # ok
val = 1
class(val) = "test"
attr(a, "something") = 0
if(val) "ok" # ok
[EDIT_1]
Еще одна приятная вещь, которую нужно объяснить, - это факторы: фактор работает не как массив символов, а как массив чисел. Эти цифры относятся к значению «флаг».
val = factor("TRUE", "FALSE")
as.numeric(val) # 1 (for TRUE), 2 (for FALSE)