这对我来说非常奇怪,我想要一个解释。我
library(gmp)
factorize(15) # => "3" "5"
max(factorize(15)) # => "5"
as.integer("5") # => 5
as.integer(max(factorize(15))) # => 1 0 0 0 1 0 0 0 1 0 0 0 5 0 0 0
我可以做我想做的事:
max(as.numeric(factorize(15))) # => [1]5
但它震惊了我,我不能依赖于函数内部的嵌套函数,而是采用类似于方案的语言。我错过了什么吗?
答案 0 :(得分:5)
嗯,答案在于factorize(15)
:
> dput(factorize(15))
structure(c(02, 00, 00, 00, 01, 00, 00, 00, 01, 00, 00, 00, 03,
00, 00, 00, 01, 00, 00, 00, 01, 00, 00, 00, 05, 00, 00, 00), class = "bigz")
和
> dput(max(factorize(15)))
structure(c(01, 00, 00, 00, 01, 00, 00, 00, 01, 00, 00, 00, 05,
00, 00, 00), class = "bigz")
... max
和as.numeric
(实际上,as.double
)有bigz
类的方法,但显然as.integer
没有:
> methods(max)
[1] max.bigq max.bigz
> methods(as.numeric)
no methods were found
> methods(as.double)
[1] as.double.bigq as.double.bigz as.double.difftime as.double.POSIXlt
> methods(as.integer)
no methods were found
...所以as.integer
将bigz
个对象视为一个简单的值向量。
答案 1 :(得分:3)
包factorize
中gmp
的结果是类bigz
的对象:
> factorize(15)
[1] "3" "5"
> str(factorize(15))
Class 'bigz' raw [1:28] 02 00 00 00 ...
从?biginteger
的帮助中,似乎为类bigz
的对象定义了以下强制函数:
as.character
as.double
请注意列表中没有as.integer
。因此,要将结果转换为数字,必须使用as.double
:
> as.double(max(factorize(15)))
[1] 5
答案 2 :(得分:2)
我同意'bigz'类没有as.integer方法似乎很奇怪。然而,可能是gmp包的整个要点是保持其值不太可能的常规R表示结构的“不在手中”。作者没有选择(还)提供整数强制函数,但你可以随时向他们建议他们应该这样做。正如@Andrie所证明的那样,可以定义这样一个函数来拦截原本会调用的.Primitive调用,这就是你现在用as.integer()
得到的。
require(gmp)
methods(as)