R: subset() връща различни резултати за еквивалентни логически изрази

Докато пишех функции за удобство за 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)

Но съм толкова любопитен защо първите две подмножества не дават идентични резултати! Идеи? мисли? Понтификации?


person machow    schedule 05.06.2012    source източник
comment
От ?subset: Предупреждение: ... по-специално нестандартната оценка на аргумента „подмножество“ може да има непредвидени последици.   -  person Joshua Ulrich    schedule 05.06.2012
comment
възможен дубликат на В R защо \[ е по-добро от subset?   -  person joran    schedule 05.06.2012


Отговори (1)


Тъй като вътре в извикването на subset символът ttl.stims се интерпретира в средата на dat, така че става (след интерпретация) dat$ttl.stims. Предвиждам, че второто извикване на подмножество връща цялата рамка от данни.

person IRTFM    schedule 05.06.2012
comment
А, промених името на ttl.stims и проработи. Благодаря за прозрението - това е наистина хубаво да се знае! Определено трябва да прочета повече за това как R оценява извикванията на функции. - person machow; 05.06.2012
comment
В този случай всичко, което трябва да знаете е, че вътре в subset или with извикване интерпретаторът преглежда първо имената на колоните за съвпадение и само ако не намери съвпадение, търси parent.frame (което може или може не е .GlobalEnv). Използването на with също се счита за опасно във функциите. - person IRTFM; 05.06.2012