14

この質問は、本質的に同じ問題を扱っている他のさまざまな質問から来ています。奇妙な理由で、別の関数内で関数を使用すると、最初の関数のローカル環境内で定義された変数が2番目の関数で見つからないという意味で失敗することがあります。

擬似コードの古典的なパターン:

ff <- function(x){
    y <- some_value
    some_function(y)
}
ff(x)

eval(expr、envir、enclos)のエラー:オブジェクト'y'が見つかりません

最初は、S4メソッドとそのスコープと関係があると思いましたが、他の関数でも発生します。私はR開発チームと何らかのやり取りをしましたが、彼らが行ったのはバグレポートサイトに私を導くことだけでした(これは最も魅力的なサイトではありません、私は言わなければなりません)。フィードバックはありませんでした。

問題が発生し続けるので、論理的な説明があるのではないかと思います。これらすべての場合によくある間違いですか?もしそうなら、どれですか?それとも本当にバグですか?

それらの質問のいくつか:

PS:あなたが疑問に思った場合に備えて、私はR-develリストを知っています...

4

4 に答える 4

5

Rには、レキシカルスコープとダイナミックスコープの両方があります。字句スコープは自動的に機能しますが、動的スコープは手動で実装する必要があり、注意深い簿記が必要です。データ分析にインタラクティブに使用される関数のみが動的スコープを必要とするため、ほとんどの作成者(私のように!)はそれを正しく行う方法を学びません。

参照:標準の非標準の評価ルール

于 2010-10-01T19:50:58.387 に答える
4

some_functionRには間違いなくバグがありますが、人々が抱えている問題の多くは、 R自体ではなく、実装のエラーであることがよくあります。Rにはスコープルールがあり(http://cran.r-project.org/doc/manuals/R-intro.html#Scopeを参照)、関数の引数の遅延評価および他のスコープの引数に対する機能と組み合わせると、eval非常に強力になります。しかし、それはしばしば微妙なエラーにつながります。

于 2010-10-01T17:29:17.540 に答える
3

ダークが彼の答えで述べたように、あなたが投稿したコードには実際には問題はありません。質問に投稿したリンクには、共通のテーマがsome_functionあるようです。何らかの方法で環境を混乱させるコードが含まれています。この混乱は、明示的に使用するか、暗黙的に引数を使用するかのいずれかでnew.envあり、おそらく次のような行があります。withdata

y <- eval(substitute(y), data)

物語の教訓は2つあります。まず、自分が何をしているかを本当に確信している場合を除いて、環境を明示的に操作することは避けてください。次に、関数にデータ引数がある場合は、関数で使用する必要のあるすべての変数をそのデータフレーム内に配置します。

于 2010-10-04T12:48:45.630 に答える
0

投稿内容に問題はありません。

/tmp$ cat joris.r 
#!/usr/bin/r -t

some_function <- function(y) y^2

ff <- function(x){
    y <- 4
    some_function(y)  # so we expect 16
}
print(ff(3))          # 3 is ignored
$ ./joris.r 
[1] 16
/tmp$

実際のバグや機能ミスを言い換えて投稿してもらえますか?

于 2010-10-01T17:32:29.233 に答える