as.integer的评估(max(factorize(15)))

时间:2011-09-27 15:08:06

标签: r

这对我来说非常奇怪,我想要一个解释。我

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

但它震惊了我,我不能依赖于函数内部的嵌套函数,而是采用类似于方案的语言。我错过了什么吗?

3 个答案:

答案 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")

... maxas.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.integerbigz个对象视为一个简单的值向量。

答案 1 :(得分:3)

factorizegmp的结果是类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)