Поведение R при использовании ifelse и eval в сочетании

отказ от ответственности: этот код - плохая практика. , и работает только из-за чего-то похожего на ошибку . Никогда не используйте его в реальной ситуации. Этот вопрос касается интересного поведения 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

Тем не менее, это не решает вопрос ...

7
задан Community 23 May 2017 в 12:11
поделиться