作者cog5566 (刃之56)
看板R_Language
標題[問題] 不會傳遞 expression 到sub-function
時間Sat Jun 1 02:00:04 2013
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
以 subsetBy 為例好了 (這是doBy package 的一個function)
這個 function 可以依照組別來篩選 data frame 的資料。
假設我想要寫一個 function 會用到 subsetBy
這個 function 的功能是依組別去除 2 倍 SD 之外的資料
問題如下:
subsetBy 的第二個參數是要輸入一個 expression (應該是吧)
如
subsetBy(~Evit, Weight < mean(Weight), data=dietox)
這個 expression 是篩選資料的算式,其中的變數會對應到 data frame
的 column name
而我想要寫一個 function 是
sdSubsetFun = function(group, dVar, data)
data 是我要操作的 data frame
dVar 是要去掉的 2SD 的目標 column name
group 是分組的依據 (class 是 formula)
但是我沒辦法將 dVar 傳進去裏面的 subsetBy 的第二個參數
程式碼如下
######################################################################
library('doBy')
sdSubsetFun = function(group, dVar, data) {
sdVar = substitute(dVar)
# 2SD threshold
subsetThreshold = substitute( (sdVar > (mean(sdVar) - 2*sd(sdVar))) &
(sdVar < (mean(sdVar) + 2*sd(sdVar))) )
dataOut = subsetBy(group,
subset = eval(subsetThreshold, group, parent.frame()),
data = data)
}
# Create Data
aa = rep(c('a','b','c'), 50)
bb = 1:150
tData = data.frame(aa,bb)
subData = sdSubsetFun(~aa, bb, tData)
######################################################################
錯誤訊息為:
> subData = sdSubsetFun(~aa, bb, tData)
Error in eval(subsetThreshold, group, parent.frame()) :
object 'subsetThreshold' not found
也就是說,裏面的 subsetBy 都不會抓我的 subsetThreshold 的值,
都還是會抓 subsetThreshold 自己本身的 expression。
要怎麼做才會讓他抓到 subsetThreshold 的值呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 139.184.222.136
→ Wush978:我是直接先把eval(subsetThreshold,...)的結果assign給 06/01 09:21
→ Wush978:data$temp 之類的變數,然後再丟到subsetBy 06/01 09:22
→ cog5566:謝謝回應。有點不太懂,這樣不會 subsetBy 也去抓變數名 06/01 16:23
→ cog5566:嗎?如果可以,可以貼上成功運作的 code 嗎 06/01 16:24
※ 編輯: cog5566 來自: 139.184.222.89 (06/01 18:02)
推 clickhere:parse(text=paste(sdVar, ">1")) 06/01 19:24
→ cog5566:不行也,會發生同樣的問題 06/02 06:19
→ cog5566:Error in paste(sdVar, ">1") : object 'sdVar' not found 06/02 06:19
推 Chris7462:他的第二個參數要輸入的是 logical 不是 expression 06/02 10:05
→ Chris7462:你用他的 example 看一下 06/02 10:05
→ Chris7462:> data(dietox) 06/02 10:05
→ Chris7462:> typeof(dietox$Weight < mean(dietox$Weight)) 06/02 10:06
→ cog5566:我想不是 logical 06/02 11:10
推 Chris7462:你試就知道了,上面寫得很清楚是 logical indicator 06/02 11:47
推 Chris7462:不要用想的,請去看他的 example 好嗎 06/02 11:55
→ clickhere:sdVar是字串 如 "bb", paste 不收 expression. 06/03 10:00