r - 是否可以对输出 bigz 对象的函数进行矢量化?
问题描述
我怀疑一定有某种方式,例如gmp
'sfactorialZ
似乎是预先矢量化的:
> library(gmp)
> factorialZ(0:9)
Big Integer ('bigz') object of length 10:
[1] 1 1 2 6 24 120 720 5040 40320 362880
并且与接受向量输入并给出向量输出的基本 R 函数一起使用似乎很舒服
> cumsum(factorialZ(0:9))
Big Integer ('bigz') object of length 10:
[1] 1 2 4 10 34 154 874 5914 46234 409114
然而,可能是因为强制,尝试Vectorize
输出 bigZ 对象的函数会遇到可怕的失败:
leftFactorial<-function(n)
{
sum(factorialZ(0:(n-1)))
}
> Vectorize(leftFactorial)(1:10)
[1] 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 01 00 00
[36] 00 01 00 00 00 01 00 00 00 04 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 0a 00 00 00 01 00 00 00 01 00
[71] 00 00 01 00 00 00 22 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 9a 00 00 00 01 00 00 00 01 00 00 00 01
[106] 00 00 00 6a 03 00 00 01 00 00 00 01 00 00 00 01 00 00 00 1a 17 00 00 01 00 00 00 01 00 00 00 01 00 00 00
[141] 9a b4 00 00 01 00 00 00 01 00 00 00 01 00 00 00 1a 3e 06 00
那么当我们想要Vectorize
一个输出 bigZ 对象的函数时应该怎么做呢?
解决方案
dput
允许可视化bigZ
对象的内部结构:raw
> dput(factorialZ(0:9))
structure(as.raw(c(0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0xd0, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0xb0, 0x13, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x80, 0x9d, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x80, 0x89, 0x05, 0x00)), class = "bigz")
使用Vectorize
withSIMPLIFY = TRUE
会产生一个简化的raw
对象向量。
如评论中所述,SIMPLIFY = FALSE
之所以有效,是因为它保留了原始Big Integer
类型:
Vectorize(leftFactorial, SIMPLIFY = FALSE)(1:10)
[[1]]
Big Integer ('bigz') :
[1] 1
[[2]]
Big Integer ('bigz') :
[1] 2
[[3]]
Big Integer ('bigz') :
[1] 4
[[4]]
Big Integer ('bigz') :
[1] 10
[[5]]
Big Integer ('bigz') :
[1] 34
[[6]]
Big Integer ('bigz') :
[1] 154
[[7]]
Big Integer ('bigz') :
[1] 874
[[8]]
Big Integer ('bigz') :
[1] 5914
[[9]]
Big Integer ('bigz') :
[1] 46234
[[10]]
Big Integer ('bigz') :
[1] 409114
推荐阅读
- javascript - AJAX/PHP - 以纯 JavaScript 分段上传大文件
- ios - UIView 和屏幕旋转上的对角渐变背景
- python - 展开嵌套的字符串列表并保存为 .txt
- visual-c++ - msbuild-bin/cl.exe 不知道 std::apply 是什么?
- java - Java Sockets:如何根据事件将多个文件从客户端发送到服务器
- selenium - Selenium 没有打开 Firefox
- c - 叶函数中的推送和弹出操作
- c - 尝试交换节点数据
- iis - 由于权限不足,Azure DevOps 管理 IIS 任务部署失败,但帐户位于本地管理员组中
- python - 使用 Python 和 beautifulsoup4 登录网站后,如何抓取搜索结果?