3

logistf::logistfand関数を使用して関数を作成していましたlogistf::forwardsex2ここでは、logistfパッケージを使用して最小限の作業例を示します。

data(sex2)
fwSel <- function(datamod) {
  fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE) 
  fw <- forward(fitnull)
  return(fw)
}
fwSel(sex2)

次の出力が得られます。

ステップ 0 : モデルの開始

is.data.frame(data) のエラー: オブジェクト 'datamod' が見つかりません`。

誰かがそれについて説明していますか?

4

1 に答える 1

6

これは、R で発生する典型的なエラーです。再度質問されましたが、残念ながら、さまざまな環境でさまざまな関数がどのように動作するか、関数がparent.envまたはの使用に従ってデータを検索しようとする方法に従って発生しますparent.frame。次の 2 つの問題のいずれかである可能性があります。

  • 遅延評価の問題:カスタム関数で datamod が現在評価されていないため、関数の前
    に使用してみてください。次の問題が存在する場合、これは機能しない可能性があります。force(datamod)logistf
  • 関数の実行環境に datamod データ セットが存在します。関数チェーン内の関数の 1 つが へのparent.frame()呼び出しまたはへの呼び出しを使用する場合parent_env()、R がさまざまな環境でデータを見つけるためにさまざまな方法で検索するため、問題が発生します。これを解決する唯一の方法は、グローバル環境で datamod を開始することです。つまり:

data(sex2)
datamod <- sex2
fwSel <- function(datamod) {
    fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE) 
    fw <- forward(fitnull)
    return(fw)
}
fwSel(sex2)

とにかくグローバル環境が検索されるため、これは間違いなく機能します。

このリンクparent.envは、 との違いとparent.frame、これら 2 つの内部関数を使用すると、直面しているような問題がどのように発生するかを知る優れた方法であることがわかります。

問題を正確に示すリンクの関数に基づいて新しい例を作成しました。

f = function() {
  print(c(f=environment(), defined_in=parent.env(environment()),  
    called_from=parent.frame()))

  #search for mydata in calling environment
  try(print(get('mydata',env=parent.frame())))  

  #search for mydata in parent evnironment
  try(print(get('mydata',env=parent.env(environment())))) 
  }

g = function() {
  mydata <- c(1,2,3)
  print(c(g=environment(), f()))
  }   

> g()
$f
<environment: 0x0000000030868df8>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x000000003086a360>

#the first get works perfect
[1] 1 2 3       

#the second produces an error
Error in get("mydata", env = parent.env(environment())) : 
  object 'mydata' not found

$g
<environment: 0x000000003086a360>

上記のようgetに、呼び出し環境での使用は機能しgetますが、親環境での使用は失敗し、エラーが発生します。これは、関数でも(おそらく)発生することです。

于 2015-02-19T11:49:26.200 に答える