Оценка as.integer (max (factorize (15))) - PullRequest
       3

Оценка as.integer (max (factorize (15)))

4 голосов
/ 27 сентября 2011

Мне это кажется довольно странным, и я хотел бы получить объяснение.Я

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 ]

5 голосов
/ 27 сентября 2011

Ну, ответ в виде 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 как простой вектор значений.

3 голосов
/ 27 сентября 2011

Результатом 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 голосов
/ 27 сентября 2011

Я согласен, что странно, что у класса bigz нет метода as.integer. Однако может случиться так, что весь смысл пакета gmp состоит в том, чтобы держать его значения "вне рук" менее способных регулярных структур представления R. Авторы не решили (пока) предлагать целочисленную функцию принуждения, но вы всегда можете предложить им, что они должны. Как продемонстрировал @Andrie, такую ​​функцию можно определить так, чтобы она перехватывала то, что в противном случае было бы вызовом .Primitive, и это то, что вы теперь получаете с as.integer().

.
require(gmp)
methods(as)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...