7

私はこれを得る:

Error in paste0(width, on, k) : object 'x' not found

なぜこの特定の行で「x」について不平を言うのか、私は完全に混乱しています!

onは文字で、width数字kです。x存在します(この関数のパラメータです)。その行と前の行は次のようになります。

print(index(x))
stopifnot(length(index(x))>=1)
#str(on);str(k);str(width)
extra=list( paste0(width,on,k) )

しかし、代わりに文句を言うコメントアウトされた行を追加すると、さらに奇妙になります:

Error in str(on) : object 'x' not found

この質問を引き起こしたのは、次の行を追加したコールレベルがいくつか上がったことです。

rm(x)

rm(list=c("x"))同じ動作をします。)

そのため、「x が見つかりません」というエラーが発生することを期待していました。しかし、その行ではありません(その関数でさえありません)!

背景: コードが という名前のグローバル変数に依存しているバグを見つけました。この変数xはパラメーターとして渡される必要があります。問題の変数は実際のコードでは「x」と呼ばれていなかったため、単体テストでは機能しましたが、実際のコードでは失敗しました!! そのため、この種のバグが他にないかどうかを確認するために、各変数を使い終わったら明示的に削除することにしました。

(上記のコード スニペットでは、誰かが「ああ、ダレン、まだ R がどのように機能するかを理解していない...」と言うのに十分でない場合は、問題を再現するための最小限の例を作成しようとします。)

4

1 に答える 1

4

これはx、関数呼び出しのパラメーターの 1 つを作成するために使用されたことが原因でした。最小限の例を次に示します。

f=function(d,on){ print(on) } #AAA

x=1:4
attr(x,'extra')=list(a=1,b="xxx")
d=mean(x)

rm(x)   #Not needed any more

f(d, attr(x,'extra') )  # BBB

ご想像のとおり、#BBB ではなく、#AAA 行 (以下を参照) でエラーが発生します。

これはattrプリミティブ関数であるためです。http://cran.r-project.org/doc/manuals/r-release/R-lang.html#Builtin-objects-and-special-formsを参照してください。

(そして、プリミティブ関数が promise オブジェクトと同じように機能すること、つまり実行を遅らせることが最終的に確認されました: http://cran.r-project.org/doc/manuals/R-ints.html#Argument-evaluation )


私が得るエラーは次のとおりです。

Error in print(on) : object 'x' not found
6: print(on) at dummy.R#1
5: f(d, (attr(x, "extra"))) at dummy.R#9
4: eval(expr, envir, enclos)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("dummy.R")

xつまり、 9 行目ではなく、1 行目には存在しないと文句を言います。関数fをもっと大きくonして、関数の奥深くまで使用しないようにすることもできます。別の関数に渡すこともonできます。実際に評価する必要があるまで、エラーがトリガーされます。たとえば、この長い例:

g=function(x,on){
    cat("Something else:",x,"\n")
    print(on)
}

f=function(d,on){
    cat("Do something:",d,"\n")
    g(d,on)
}

x=1:4
attr(x,'extra')=list(a=1,b="xxx")
d=mean(x)

rm(x)   #Not needed any more

f(d, (attr(x,'extra')) )

この例にスパイスを加えるために、xtoというパラメーターも追加しましたg()。これは元の質問のコードを反映しており、これがどのように混乱を招く可能性があるかは簡単にわかります。オビ=ワンの言葉を言い換えると、「これはxあなたが探しているものではありません...」

于 2013-06-27T08:13:11.797 に答える