為什么`[`比‘子集’好‘?當我需要過濾data.framework,即提取符合特定條件的行時,我更喜歡使用subset職能:subset(airquality, Month == 8 & Temp > 90)而不是[職能:airquality[airquality$Month == 8 & airquality$Temp > 90, ]我喜歡的主要原因有兩個:我發(fā)現(xiàn)代碼從左到右讀得更好。即使對R一無所知的人也能知道subset上面的聲明正在做。因為列可以在select表情,我可以保存一些擊鍵。在上面的例子中,我只需鍵入airquality一次subset,但是有三次[.所以我過著幸福的生活subset到處都是,因為它更短,讀得更好,甚至向我的R程序員們宣傳它的美麗。但昨天我的世界崩潰了。在閱讀subset文檔,我注意到本節(jié):警告這是一個便于交互使用的功能。對于編程來說,最好使用[這樣的標準子集設(shè)置函數(shù),特別是參數(shù)子集的非標準計算可能會產(chǎn)生意想不到的后果。有人能幫我澄清作者的意思嗎?首先,他們所說的“供交互使用“?我知道什么是交互式會話,而不是以批處理模式運行的腳本,但我不認為它會產(chǎn)生什么不同。那么,請你解釋一下“參數(shù)子集的非標準求值“為什么它是危險的,也許可以舉個例子?”
2 回答

慕姐4208626
TA貢獻1852條經(jīng)驗 獲得超7個贊
這是一個有點長的閱讀,所以在這里記錄下Hadley使用的最直接地解決“什么會出錯?”的例子可能是有幫助的:
Hadley建議如下示例:假設(shè)我們想要子集,然后使用以下函數(shù)重新排序數(shù)據(jù)幀:
scramble?<-?function(x)?x[sample(nrow(x)),?]subscramble?<-?function(x,?condition)?{ ??scramble(subset(x,?condition))}subscramble(mtcars,?cyl?==?4)
這將返回錯誤:
val中的錯誤(Exr,Invir,Ends):找不到對象“cyl”
因為R不再“知道”在哪里找到名為‘cyl’的對象。他還指出,如果在全球環(huán)境中偶然有一個叫做“cyl”的物體,那么可能會發(fā)生一些真正奇怪的事情:
cyl?<-?4subscramble(mtcars,?cyl?==?4)cyl?<-?sample(10,?100,?rep?=?T)subscramble(mtcars,?cyl?==?4)
(你自己跑吧,這太瘋狂了。)

POPMUISE
TA貢獻1765條經(jīng)驗 獲得超5個贊
[
require(microbenchmark) microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,]) Unit: microseconds expr min lq median uq max neval subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903 100 airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058 100
- 2 回答
- 0 關(guān)注
- 666 瀏覽
添加回答
舉報
0/150
提交
取消