3 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個贊
這里的答案是好的,但是它們?nèi)鄙僦匾囊稽c(diǎn)。讓我嘗試描述一下。
R是一種功能語言,不喜歡對其對象進(jìn)行突變。但是它確實(shí)允許使用替換函數(shù)進(jìn)行賦值語句:
levels(x) <- y
相當(dāng)于
x <- `levels<-`(x, y)
訣竅是,這種重寫是由<-; 完成的。它不是由levels<-。levels<-只是一個接受輸入并給出輸出的常規(guī)函數(shù);它不會改變?nèi)魏螙|西。
結(jié)果之一是,根據(jù)上述規(guī)則,<-必須是遞歸的:
levels(factor(x)) <- y
是
factor(x) <- `levels<-`(factor(x), y)
是
x <- `factor<-`(x, `levels<-`(factor(x), y))
這種純功能的轉(zhuǎn)換(直到最后,發(fā)生賦值)等同于一種命令式語言中的賦值,這是一種美麗。如果我沒記錯的話,這種用功能語言構(gòu)造的鏡頭稱為鏡頭。
但是,一旦您定義了諸如的替換函數(shù)levels<-,您將獲得另一個意想不到的意外收獲:您不僅具有進(jìn)行分配的能力,還擁有一個方便的函數(shù),該函數(shù)吸收了一個因數(shù),并給出了另一個具有不同級別的因數(shù)。確實(shí)沒有任何“分配”!
因此,您所描述的代碼只是利用的另一種解釋levels<-。我承認(rèn)這個名稱levels<-有點(diǎn)令人困惑,因?yàn)樗凳玖艘豁?xiàng)任務(wù),但是事實(shí)并非如此。該代碼只是建立了一種管道:
從...開始 dat$product
將其轉(zhuǎn)換為因子
改變水平
存放在 res
我個人認(rèn)為代碼行很漂亮;)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個贊
沒有法寶,這就是(子)分配功能的定義方式。 levels<-有所不同,因?yàn)樗牵ㄗ樱┓峙湟蜃訉傩远皇窃乇旧淼脑己瘮?shù)。有很多此類函數(shù)的示例:
`<-` # assignment
`[<-` # sub-assignment
`[<-.data.frame` # sub-assignment data.frame method
`dimnames<-` # change dimname attribute
`attributes<-` # change any attributes
其他二進(jìn)制運(yùn)算符也可以這樣調(diào)用:
`+`(1,2) # 3
`-`(1,2) # -1
`*`(1,2) # 2
`/`(1,2) # 0.5
既然您知道了,類似這樣的事情應(yīng)該真的讓您大吃一驚:
Data <- data.frame(x=1:10, y=10:1)
names(Data)[1] <- "HI" # How does that work?!? Magic! ;-)

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個贊
之所以說是“魔術(shù)”,是因?yàn)椤百x值”表格必須具有實(shí)際變量才能使用。而且factor(dat$product)沒有分配任何東西。
# This works since its done in several steps
x <- factor(dat$product)
levels(x) <- list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
x
# This doesn't work although it's the "same" thing:
levels(factor(dat$product)) <- list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
# Error: could not find function "factor<-"
# and this is the magic work-around that does work
`levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
- 3 回答
- 0 關(guān)注
- 864 瀏覽
添加回答
舉報