作者Chris7462 (~烤焦面包~)
看板R_Language
标题Re: [问题] 不会传递 expression 到sub-function
时间Sun Jun 2 10:24:21 2013
※ 引述《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)