13

Rには次の2つの機能があります。

exs.time.start<-function(){
  exs.time<<-proc.time()[3]
  return(invisible(NULL))
}

exs.time.stop<-function(restartTimer=TRUE){
  if(exists('exs.time')==FALSE){
    stop("ERROR: exs.time was not found! Start timer with ex.time.start")
  }
  returnValue=proc.time()[3]-exs.time
  if(restartTimer==TRUE){
    exs.time<<-proc.time()[3]
  }
  message(paste0("INFO: Elapsed time ",returnValue, " seconds!"))
  return(invisible(returnValue))
}

この関数は、関数を呼び出した瞬間の CPU 時間でexs.time.startグローバル変数 ( ) を作成します。exs.time

関数exs.time.stopはそのグローバル変数にアクセスし、 と の実行間の時間を返しexs.time.startますexs.time.stop

私の目的は、これら 2 つの関数を使用して R でパッケージを作成することです。exs.timeそのグローバル変数 ( ) をユーザーには見えない変数に定義して、R グローバル環境でこの変数を見ることができないようにするにはどうすればよいですか?

この変数を R パッケージ環境/名前空間内の「非表示」グローバル変数として定義できますか?

パッケージを扱うのは初めてなので、パッケージを定義するときに名前空間ファイルをうまく使用する方法が正確にはわかりません。R Studio と Roxygen2 を使用してパッケージを作成しています。

どんな助けや提案も素晴らしいでしょう!

4

2 に答える 2

13

あなたのパッケージを共有してくれてありがとう@Dirk Eddelbuettel

私の質問の解決策は次のとおりです。

.pkgglobalenv <- new.env(parent=emptyenv())

exs.time.start<-function(){
  assign("exs.time", proc.time()[3], envir=.pkgglobalenv)
  return(invisible(NULL))
}

exs.time.stop<-function(restartTimer=TRUE){
  if(exists('exs.time',envir=.pkgglobalenv)==FALSE){
    stop("ERROR: exs.time was not found! Start timer with exs.time.start")
  }
  returnValue=proc.time()[3]-.pkgglobalenv$exs.time
  if(restartTimer==TRUE){
    assign("exs.time", proc.time()[3], envir=.pkgglobalenv)
  }
  message(paste0("INFO: Elapsed time ",returnValue, " seconds!"))
  return(invisible(returnValue))
}
  • new.env()関数定義の前に、R ファイル内に を使用して環境を作成しました。
  • 環境にアクセスしてassign()、グローバル変数の値を変更していました!

変数は隠され、すべて正常に動作します! みんなありがとう!

于 2015-12-13T19:44:58.247 に答える
8

私はいくつかのパッケージでパッケージグローバル環境を使用しています:

おそらく他にもいくつかありますが、あなたはアイデアを得る.

于 2015-12-13T18:53:48.227 に答える