2012-02-08 66 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核心的功能請求;-)