从mpfr生成的列表中获取值

3
考虑以下向量:
> v1
[1] 0.000000e+00 0.000000e+00 1.110223e-16 4.440892e-15 3.266195e-08 2.531242e-07   
1.041204e-05 1.172329e-05 1.672447e-05 1.803203e-05

我已经使用Rmpfr软件包中的函数(mpfr)将其应用于v1:
> v2<-sapply(v1,function(x){mpfr(x,5)})

v2 显然是一个列表,但我无法获得实际值。我尝试使用 unlist、v2[[]]、将 v2[[]] 转换为字符或向量等方法。

> v2

[[1]]
'mpfr1' 0

[[2]]
'mpfr1' 0

[[3]]
 'mpfr1' 1.11e-16

1
使用sapply()查看str(v2)的输出,以查看返回的所有细节。 - Chase
5个回答

5

实际上,我也遇到了类似的问题,因为这是我第一次使用这个软件包。无论如何,我已经找到了一个简单的解决方案,虽然可能不是最优雅的...:

   # Compute 1/7 with 1000 bit precision and store the value in a character object
   x <- mpfr(1,1000)/7
   x.output <- capture.output(x)[2]
   result <- substr(x.output,5,nchar(x.output))

2
你可能需要使用str()函数,带有选项give.head=FALSEdigits.d
> x<-mpfr(1,120)/7

> x    #This would print the precision info
1 'mpfr' number of precision  120   bits
[1] 0.14285714285714285714285714285714285722

> str(x, give.head=FALSE, digits.d=10)
0.1428571429

如果你想存储这个字符串,你需要使用capture.output():
> y<-capture.output(str(x, give.head=FALSE, digits.d=10))
> y
[1] "0.1428571429"

1

我认为你根本不需要使用sapply(),你可以直接传入一个向量:

require(Rmpfr)
v1 <- c(0.000000e+00, 0.000000e+00, 1.110223e-16, 4.440892e-15, 3.266195e-08, 2.531242e-07)
v2 <- mpfr(v1,5)
#-----
> v2
6 'mpfr' numbers of precision  5   bits 
[1]        0        0 1.11e-16 4.44e-15  3.35e-8  2.53e-7

顺便提一下,我以前从未使用过这个包或函数,因此建议您仔细阅读?mpfr,以确保您了解参数及其影响。


我使用了sapply,因为该函数是我应用于该向量的函数的一部分,而且我只在那里得到错误。但我认为在这种情况下,该软件包的帮助页面还不够详细。谢谢。 - agatha
我仍然无法从那个向量中获取实际值,如果你输入v2[1]:1 mpfr精度为5位数 [1] 0。 - agatha
@agatha - 你想用实际值做什么,而不能做什么?你确定这不只是一个格式/打印问题吗?例如,将该向量乘以 pi 似乎会给出合理的结果:> v2 * pi 6 'mpfr' numbers of precision 5 bits [1] 0 0 3.47e-16 1.38e-14 1.04e-7 8.05e-7 - Chase
因为我需要这个格式化的值原样打印在HTML生成的报告中。你还使用什么来近似实数,使其保留一定数量的数字,而不会将非常接近的小数四舍五入为相同的数字呢? - agatha

0

Rmpfr 包中实际上有一个方法可以处理从 mpfr 类型到数字的转换,称为 asNumeric。您可以像其他答案建议的那样与 sapply 结合使用。

v1 <- c(0.000000e+00, 0.000000e+00, 1.110223e-16, 4.440892e-15, 3.266195e-08, 2.531242e-07, 1.041204e-05, 1.172329e-05, 1.672447e-05, 1.803203e-05)
v2 <- sapply(v1,function(x){mpfr(x,5)})

v2_numeric <- sapply(v2, asNumeric)
v2_numeric

输出:

 [1] 0.000000e+00 0.000000e+00 1.110223e-16 4.440892e-15 3.352761e-08 2.533197e-07 1.049042e-05 1.192093e-05 1.716614e-05
[10] 1.811981e-05

0

另一种解决方案:

x <- 2*Rmpfr::pnorm(mpfr((1.0490/0.0246), precBits=100), lower.tail=FALSE, log.p = FALSE)

1 'mpfr' number of precision  100   bits 
[1] 2.6253807992339014869315885783658e-397

sub("\'mpfr1\' ", "", capture.output(x@.Data[[1]]))
[1] "2.6253807992339014869315885783658e-397"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接