отказ от ответственности: этот код - плохая практика. , и работает только из-за чего-то похожего на ошибку . Никогда не используйте его в реальной ситуации. Этот вопрос касается интересного поведения R, не более того.
Прочитав этот вопрос , я сильно озадачился. Очевидно, ifelse может получить доступ к информации, которая должна быть скрыта.
Допустим, мы делаем:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
Мы не получаем вывода. Логика, поскольку оба выражения на самом деле являются присваиваниями вектора dd. Тогда eval () не должен выдавать результат. Но как ни странно, когда вы пробуете забавный код
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
, вы получаете результат ??? У кого-нибудь есть объяснение этому?
Это не так просто, как «R вычисляет, а затем использует dd». Какой бы приказ вы ни дали z, какое бы условие вы ни использовали, dd всегда будет последним из упомянутых eval ()
.
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> z <- c(0,1)
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(y),eval(x))
> dd
[1] 1 2 3
РЕДАКТИРОВАТЬ:
более пристальный взгляд на исходный код ifelse показывает, что строка, удостоверяющая, что это происходит, - это rep ()
:
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
Тем не менее, это не решает вопрос ...