[問題] 不會傳遞 expression 到sub-function

看板R_Language作者 (刃之56)時間11年前 (2013/06/01 02:00), 編輯推噓4(4011)
留言15則, 4人參與, 最新討論串1/8 (看更多)
[問題類型]: 程式諮詢(我想用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

06/01 09:21, , 1F
我是直接先把eval(subsetThreshold,...)的結果assign給
06/01 09:21, 1F

06/01 09:22, , 2F
data$temp 之類的變數,然後再丟到subsetBy
06/01 09:22, 2F

06/01 16:23, , 3F
謝謝回應。有點不太懂,這樣不會 subsetBy 也去抓變數名
06/01 16:23, 3F

06/01 16:24, , 4F
嗎?如果可以,可以貼上成功運作的 code 嗎
06/01 16:24, 4F
※ 編輯: cog5566 來自: 139.184.222.89 (06/01 18:02)

06/01 19:24, , 5F
parse(text=paste(sdVar, ">1"))
06/01 19:24, 5F

06/02 06:19, , 6F
不行也,會發生同樣的問題
06/02 06:19, 6F

06/02 06:19, , 7F
Error in paste(sdVar, ">1") : object 'sdVar' not found
06/02 06:19, 7F

06/02 10:05, , 8F
他的第二個參數要輸入的是 logical 不是 expression
06/02 10:05, 8F

06/02 10:05, , 9F
你用他的 example 看一下
06/02 10:05, 9F

06/02 10:05, , 10F
> data(dietox)
06/02 10:05, 10F

06/02 10:06, , 11F
> typeof(dietox$Weight < mean(dietox$Weight))
06/02 10:06, 11F

06/02 11:10, , 12F
我想不是 logical
06/02 11:10, 12F

06/02 11:47, , 13F
你試就知道了,上面寫得很清楚是 logical indicator
06/02 11:47, 13F

06/02 11:55, , 14F
不要用想的,請去看他的 example 好嗎
06/02 11:55, 14F

06/03 10:00, , 15F
sdVar是字串 如 "bb", paste 不收 expression.
06/03 10:00, 15F
文章代碼(AID): #1HgEKdjH (R_Language)
文章代碼(AID): #1HgEKdjH (R_Language)