@alexis_lazはコメントで指摘したように、gmp::print.bigz
はすでに長さを計算しますが任意の使用可能な形式でそれを返しません。私はいくつかのgmp
ソースコードに掘りを行なったし、これを見つけた:あなたが見ることができるように
print.bigz <- function(x, quote = FALSE, initLine = is.null(modulus(x)), ...)
{
if((n <- length(x)) > 0) {
if(initLine) {
cat("Big Integer ('bigz') ")
kind <- if(isM <- !is.null(nr <- attr(x, "nrow")))
sprintf("%d x %d matrix", nr, n/nr)
else if(n > 1) sprintf("object of length %d", n) else ""
cat(kind,":\n", sep="")
}
print(as.character(x), quote = quote, ...)
}
else
cat("bigz(0)\n")
invisible(x)
}
が、それはあなたのbigz
オブジェクトを返すようにcat
機能を使用しています。 this questionとthis answerから、要求された情報を取得することは可能ですが、単にlength
と呼ぶだけでは効率的ではありません。以下は、長さを得るための非常に粗い関数です。
BigZLength <- function(x) {
b <- capture.output(x)
a <- strsplit(b[1], split=" ")[[1]][7]
if (!is.na(a)) {as.integer(substr(a,1,nchar(a)-1))} else {1L}
}
system.time(sapply(1:10^5, function(x) length(BigZ)))
user system elapsed
0.67 0.00 0.67
system.time(sapply(1:10^5, function(x) BigZLength(BigZ)))
user system elapsed
24.57 0.01 24.71
私はあなたが正規表現(または何か他のもの)を使用して、より効率的な機能を書くことができ確信している、しかし、私はそれが単にlength
を呼ぶほど効率的になるとは考えていません。実際には、上記のコードでは、単に出力をcat
にするだけです。
system.time(sapply(1:10^5, function(x) capture.output(BigZ)))
user system elapsed
20.00 0.00 20.03
あなたはあなたが単純で関数を入力して、与えられた関数のソースコードを見ることができることを知っているR
に精通している場合
上のソースコードを取得についての注意コンソールのようにそれを印刷する:
numbers::nextPrime
function (n)
{
if (n <= 1)
n <- 1
else n <- floor(n)
n <- n + 1
d1 <- max(3, round(log(n)))
P <- Primes(n, n + d1)
while (length(P) == 0) {
n <- n + d1 + 1
P <- Primes(n, n + d1)
}
return(as.numeric(min(P)))
}
<environment: namespace:numbers>
ただし、時にはこれはできません。 gmp::print.bigz
と例えば、私たちは得る:
gmp::print.bigz
Error: 'print.bigz' is not an exported object from 'namespace:gmp'
はジョシュアウルリッヒの素晴らしいquestionとanswerを入力します。以下に示すコードを使用して、任意のパッケージのソースコードをダウンロードして1行に展開することができます。
untar(download.packages(pkgs = "gmp",
destdir = ".",
type = "source")[,2])
これは、ディレクトリにコンパイル済みのコードをすべて含むフォルダを作成します。上記ソースコードは.\gmp\R\biginteger.R
ファイルにあります。
'gmp ::: print.bigz'も' gmp ::: length.bigz'を使って 'length'を計算します。 'length.bigz'は' length'のような属性アクセス関数ではないようです。 'ns = c(1、10、50、100、200、500、1e3、5e3,1e4);を参照してください。 (ms)))$ median}); timings = sapply(ns、function(n){x = as.bigz(seq_len(n));サマリー(マイクロベンチマーク(長さ(x)、単位= "ms"プロット(ns、タイミング) '。私は、 "bigz"を作成するときに属性として "長さ"を保存する価値があるかもしれないと思います。 –
あなたの質問にあなたの答えを載せるのではなく(あなたの質問を未解決のままにしておきます)、あなた自身の質問に答えてください。 – Gregor
@ Gregor、私は私の答えが十分に徹底していたかどうか分からなかったので、答えとして掲示することに躊躇しました。 Anywho、私はあなたの提案をしました。 –