Re: [問題] 不會傳遞 expression 到sub-function
※ 引述《cog5566 (刃之56)》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: [軟體熟悉度]:
: 入門(寫過其他程式,只是對語法不熟悉)
: [問題敘述]:
: 以 subsetBy 為例好了 (這是doBy package 的一個function)
: 這個 function 可以依照組別來篩選 data frame 的資料。
: 假設我想要寫一個 function 會用到 subsetBy
: 這個 function 的功能是依組別去除 2 倍 SD 之外的資料
: 問題如下:
: subsetBy 的第二個參數是要輸入一個 expression (應該是吧)
subsetBy(formula, subset, data = parent.frame(), select, drop=FALSE,
join=TRUE, ... )
第二個參數是 logical 不是 expression,可以看他的說明
subset logical expression indicating elements or rows to keep: missing values
taken as false.
用他的 example 看一下就知道了
sbstBy> data(dietox)
sbstBy> subsetBy(~Evit, Weight < mean(Weight), data=dietox)
data(dietox)
dietox$Weight < mean(dietox$Weight)
: 如
: 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))) )
+ subsetThreshold = (dVar > (mean(dVar) - 2*sd(dVar))) &
+ (dVar < (mean(dVar) + 2*sd(dVar)))
: dataOut = subsetBy(group,
: - subset = eval(subsetThreshold, group, parent.frame()),
+ subset = subsetThreshold,
: data = data)
: }
- 是刪除,+ 是新增。這樣應該就可以用了 :p
: # 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: 36.229.4.177
※ 編輯: Chris7462 來自: 36.229.4.177 (06/02 10:26)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 2 之 8 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章