Оцените символическое выражение Рякаса - PullRequest
4 голосов
/ 13 декабря 2011

Это воспроизводимый пример:

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)?

1 Ответ

3 голосов
/ 13 декабря 2011

Г. Гротендик отметил в комментариях, что сначала вам нужно будет захватить выражение, которое будет использоваться ниже:

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
...