2011-12-12 103 views
4

這是一個可再現的例子:評估符號Ryacas表達

a <- 0.05 
za.2 <- qnorm(1-a/2) 
b <- 0.20 
zb <- qnorm(1-b) 

lambda12 <- -log(1/2)/12 
lambda18 <- -log(1/2)/18 
theta <- lambda18/lambda12 
(d = round(4*(za.2+zb)^2/log(theta)^2)) 

Tf<-36 
library(Ryacas) 
n <- Sym("n") 

Solve(n/2*(2-exp(-lambda12*Tf)-exp(-lambda18*Tf))==d , n) 

最後一行返回

expression(list(n == 382/1.625)) 

有一種方法來提取的商和將其分配給另一個變量(235.0769)?

回答

3

G.Grothendieck在你需要搶先佔領表達以下時要操作的評論指出:

soln <- Solve(n/2*(2-exp(-lambda12*Tf)-exp(-lambda18*Tf))==d , n) 
X <- yacas(soln)$text 

然後,提取商,你可以採取這樣的事實優勢很多R語言對象都可以被強制轉換爲列表。

X <- expression(list(n == 382/1.625)) 
res <- eval(X[[1]][[2]][[3]]) 
res 
[1] 235.0769 

下面只說明瞭爲什麼索引的該序列中提取右片的表達式:

as.list(X) 
# [[1]] 
# list(n == 382/1.625) 

as.list(X[[1]]) 
# [[1]] 
# list 
# 
# [[2]] 
# n == 382/1.625 

as.list(X[[1]][[2]]) 
# [[1]] 
# `==` 
# 
# [[2]] 
# n 
# 
# [[3]] 
# 382/1.625 
+2

如果'SOLN < - 解決(N/2 *(2-EXP(-lambda12 * TF )-exp(-lambda18 * Tf))== d,n)'然後設置'x < - yacas(soln)$ text',現在按照海報的說明進行操作。 –

+0

@ G.Grothendieck - 感謝您的有用評論。我將它嫁接在上面,以便完成答案。 –

+0

@G。格洛騰迪克謝謝。這是我錯過的一步。發佈它作爲答案。 –