2012-02-08 93 views
2

我要评估一个变量f与平均= 7评估表达两个变量

mean=7 
f <- expression(-(x-mean)^2/2) 

然后得到一个新的表达式:

-(x-7)^2/2 

我怎么能这样做呢?谢谢。

回答

0

gsub怎么样?

avg <- 7 
f <- expression(-(x-avg)^2/2) 
f.new <- as.expression(gsub('avg',avg,f)) 

expression("-(x - 7)^2/2") 
在一个侧面说明

,你应该避免定义与像meandata因为它们都建在R函数的名称变量。

+0

谢谢。我的表情很长,而且有很多变数。我会尝试你的方法。 – moli 2012-02-08 21:24:11

+1

我认为@JoshO'Brien有更好的方法。但是如果你使用'gsub',确保你要替换的字符串是唯一的,而不是别的东西的子字符串。 – Tommy 2012-02-08 21:39:11

+0

@Tommy(Josh +1)我倾向于同意。 – Justin 2012-02-08 21:56:26

2

这是一种方法。

f <- as.call(f) 
eval(substitute(substitute(expr, list(mean=7)), list(expr= f))) 
# -(x - 7)^2/2() 

如果建筑感觉精神错乱的,你不需要孤单的感觉:即使是谁写将R手动的家伙叫你在这里"a puzzle"所造成的问题。

+0

+1很好的使用替代品两次。但'f <-quote( - (x-mean)^ 2/2))'可能是指定表达式的更好方法...''as.call'对'expression(mean)'不起作用。 。 – Tommy 2012-02-08 21:35:59

+0

@Tommy - 是的,我想过提出这个建议,很高兴你在这里发表评论。我想,即使是有什么东西可以咀嚼。对我来说,这感觉就像一个公案 - 短小精悍,在经过几个小时的沉思之后仍然有回报。我还没有得到为什么'f'需要是一个电话而不是一个表达式,所以我想我还不是“那里”呢) – 2012-02-08 21:46:07

+0

@Josh O'Brien感谢您的回复。 – moli 2012-02-08 22:23:08

0

在S-Plus中,substitute函数有一个额外的evaluate参数,所以在那里它很容易。不幸的是,R缺少这一论点......

# in S-Plus: 
x <- expression(-(x-mean)^2/2) 
substitute(x, list(mean=7), evaluate=TRUE) 
#-(x - 7)^2/2 

......所以你必须诉诸于什么@ JoshO'Brien建议。考虑将此记录为具有R核心的功能请求;-)