2016-09-21 22 views
0

Shinyプロジェクトではグローバル変数を使用しています。私はいつも<を使用してエラーを作ります - < < - を使用してください。しかし、狂ったことは、変数がグローバル環境に存在する場合に存在しないローカル変数に代入しようとすると、Rがエラーをスローしないということです。ローカルには存在しないが、グローバルには存在しない変数にローカルに割り当てるときにエラーが表示されない

これはバグですか、またはここにbbb $ bbb割り当てがccc $ ccc割り当てのようにエラーを発生させない何らかの理由がありますか?

aaa <- list(aaa="old") 
bbb <- list(bbb="old") 

f = function(x){ 
    aaa$aaa <<- x 
    bbb$bbb <- x 
    ccc$ccc <- x 
} 
f("new") 
#Error in ccc$ccc <- x : object 'ccc' not found 

aaa 
#$aaa 
#[1] "new" 

bbb 
#$bbb 
#[1] "old" 

ccc 
#Error: object 'ccc' not found 

答えて

2

これはバグではありませんが、予期しない動作です。

R language definitionは言う:構造体のサブセットに

3.4.4サブセット割り当て

割り当ては、複雑な割当てのための一般的 機構の特別な場合である。

x[3:5] <- 13:15 

このコマンドの結果は、以下のように実行されたものです。

`*tmp*` <- x 
x <- "[<-"(`*tmp*`, 3:5, value=13:15) 
rm(`*tmp*`) 

したがって、最初の手順では、グローバルリストbbbのコピーがローカル変数*tmp*になります。その後、サブセットの代入が行われ、結果は関数の復帰後に失われる(新しい)ローカル変数bbbに割り当てられます。

PS:副作用が悪く、避けるべきです。グローバル変数は使用しないでください。関数はパラメータとして入力を渡され、すべての出力(プロットやファイルを除く)が返されます。

+0

だから、あなたはccc $ cccに対して、エラーは '* temp *' < - x;によってスローされると言っています。しかし、bbb $ bbbの場合、それは地球環境で見つかったのでエラーではありませんか? – 3D0G

+0

Shinyでは、ユーザーがWebページ上に何らかのデータを入力すると、server()関数内のobserveEvent()関数内で制御を取得します。私はデータを保存したいので、実際にはそれをグローバルに割り当ててグローバルにファイルに保存するしかありません。 observeEvent()が返ってくると、それはserver()に戻り、制御が失われるので、(the_data)を返す場所はありません。 – 3D0G

+0

最初のコメントはYesです。私は光沢を使用しないが、それは悪いプログラミングの慣行を必要とするのではないかと疑う。 – Roland

関連する問題