作者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
1F:→ Wush978:我是直接先把eval(subsetThreshold,...)的结果assign给 06/01 09:21
2F:→ Wush978:data$temp 之类的变数,然後再丢到subsetBy 06/01 09:22
3F:→ cog5566:谢谢回应。有点不太懂,这样不会 subsetBy 也去抓变数名 06/01 16:23
4F:→ cog5566:吗?如果可以,可以贴上成功运作的 code 吗 06/01 16:24
※ 编辑: cog5566 来自: 139.184.222.89 (06/01 18:02)
5F:推 clickhere:parse(text=paste(sdVar, ">1")) 06/01 19:24
6F:→ cog5566:不行也,会发生同样的问题 06/02 06:19
7F:→ cog5566:Error in paste(sdVar, ">1") : object 'sdVar' not found 06/02 06:19
8F:推 Chris7462:他的第二个参数要输入的是 logical 不是 expression 06/02 10:05
9F:→ Chris7462:你用他的 example 看一下 06/02 10:05
10F:→ Chris7462:> data(dietox) 06/02 10:05
11F:→ Chris7462:> typeof(dietox$Weight < mean(dietox$Weight)) 06/02 10:06
12F:→ cog5566:我想不是 logical 06/02 11:10
13F:推 Chris7462:你试就知道了,上面写得很清楚是 logical indicator 06/02 11:47
14F:推 Chris7462:不要用想的,请去看他的 example 好吗 06/02 11:55
15F:→ clickhere:sdVar是字串 如 "bb", paste 不收 expression. 06/03 10:00