2012-06-05 3 views
2

При написании удобных функций для subset() я столкнулся с странной ситуацией, когда использование эквивалентных логических операторов возвращает разные подмножества. Так, например:R: subset() возвращает разные результаты для эквивалентных логических выражений

dat = data.frame(ttl.stims = c(4,4,8,8), change = c('big', 'small')) 
dat 
ttl.stims = 4 

#logical statements are equivalent 
dat$ttl.stims == 4 
dat$ttl.stims == ttl.stims 

#subset evaluates differently 
subset(dat, dat$ttl.stims == 4) 
subset(dat, dat$ttl.stims == ttl.stims) 

Я работал вокруг этого дела:

index = dat$ttl.stims == ttl.stims 
subset(dat, index) 

Но я так любопытно, почему первые два подмножества не дают одинаковые результаты! Идеи? Мысли? Pontifications?

+5

Из '? Subset':« Предупреждение: ... в частности, нестандартная оценка аргумента «подмножество» может иметь непредвиденные последствия ». –

+0

Возможный дубликат [В R, почему '\ [' лучше, чем 'подмножество'?] (Http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset) – joran

ответ

4

Потому что внутри вызова subset символ ttl.stims получает интерпретируется в среде dat, так что он становится (после интерпретации) dat$ttl.stims. Я предсказываю, что второй вызов подмножества возвращает весь фрейм данных.

+0

Ah , Я изменил имя 'ttl.stims', и он сработал. Спасибо за понимание - это действительно хорошо знать! Мне определенно нужно больше узнать, как R оценивает вызовы функций. – machow

+0

В этом случае все, что вам нужно знать, это то, что внутри 'подмножества' или' с' вызов интерпретатор сначала смотрит на имена столбцов для соответствия, и только если он не находит совпадение, он смотрит на parent.frame (который может быть или не быть «.GlobalEnv'). Использование 'with' также считается опасным внутри функций. –

 Смежные вопросы

  • Нет связанных вопросов^_^