web-dev-qa-db-ja.com

Shinyの「タイプ 'closure'のオブジェクトはサブセットできない」エラーとは何ですか?

光沢のあるアプリがあり、それを実行するとobject of type ‘closure’ is not subsettable。それは何ですか、どうすれば修正できますか?

:私はこの質問をたくさん書いたので書きましたが、可能性のあるだましはshinyに関連していないか、または答えが広く適用できることは明らかではないほど具体的です。

11
John Paul

この質問 も参照してください。これは、Shiny以外のコンテキストでこのエラーをカバーしています。

これを修正する方法:

これは、光沢のあるアプリで非常に一般的なエラーです。これは、reactive()関数を使用してlist、_data.frame_、またはvectorなどのオブジェクトを作成するときに最も一般的に表示されます。つまり、オブジェクトは入力の種類。これを行う場合、後でオブジェクトを参照するときに、括弧を含める必要があります。

たとえば、次のようにリアクティブな_data.frame_を作成するとします。

_MyDF<-reactive({ code that makes a data.frame with a column called “X” })
_

その後、_data.frame_を参照し、MyDFまたは_MyDF$X_を呼び出すと、エラーが発生します。代わりに、MyDF()またはMyDF()$Xにする必要があります。reactive()を使用して作成するオブジェクトには、この命名規則を使用する必要があります。

これが起こる理由:

_data.frame_などのリアクティブオブジェクトをreactive()を使用して作成する場合、それを他の非リアクティブな_data.frame_と同じように考え、それに応じてコードを記述したい場合があります。ただし、作成したのは実際には_data.frame._ではありません。むしろ、作成したのは命令、関数の形式でで、これは_data.frame_の作成方法を示します。必要なとき。実際にこの関数を使用して_data.frame_を取得する場合、Rの他の関数と同様に括弧を使用する必要があります。括弧を使用することを忘れた場合、Rは、関数とエラーを提供します。入力してみてください:

_plot$x
_

コマンドラインで同じエラーが表示されます。

アプリの起動時にこのエラーが表示されない場合があります。リアクティブオブジェクトには、いわゆる「遅延」評価があります。これらは、何らかの出力に必要になるまで評価されません。したがって、_data.frame_がプロットの作成にのみ使用される場合、_data.frame_は、ユーザーが初めてプロットを見るまで存在しません。アプリの起動時にユーザーがボタンをクリックするかタブを変更してプロットを表示する必要がある場合、_data.frame_のコードはそれが発生するまで評価されません。それが起こると、入力の現在の値を使用して、プロットを作成するために必要な_data.frame_を構築する関数を実行します。かっこを使用するのを忘れた場合は、この時点でshinyがエラーを表示します。入力が変化しても、ユーザーがプロットを見ていなければ、_data.frame_を作成する関数は、ユーザーが再びプロットを見るまで再実行されないことに注意してください。

29
John Paul