| スピーカー |
トランスクリプト |
| ウェンディ・マーフリー |
本日はプレゼンテーションにご参加いただきありがとうございます。スクリプト作成者の経験レベルを問わず、よくあるシナリオについてお話しできることを楽しみにしています。 |
| |
私たちの目的は、何が起こっているのかを説明し、これらの間違いを避けるためのツールと知識を皆さんに提供することです。それでは始めましょう。 |
| |
デフォルトでは開いていないため、ログでメッセージを確認するのを忘れがちです。しかし、ログには最近のスクリプト実行に関する有用な情報が含まれています。それでは、JMPの例を詳しく見てみましょう。 |
| |
ここでは、スクリプトがデータテーブルを開いて行の選択を試みるだけであることがわかります。このスクリプトを実行すると、 |
| |
致命的なエラー、つまりエラーによってスクリプトが停止する状況では、対話型のエラーメッセージが表示されます。このポップアップウィンドウはJMP 15の新機能であり、設定でオフにすることができます。 |
| |
そのメッセージを閉じると、ログを確認することができ、ウィンドウに同じメッセージが表示されますが、行番号も表示されます。 |
| |
問題箇所を特定するために、スクリプトファイル名もお知らせください。ただし、これらのポップアップウィンドウだけに頼るのではなく、ログにも重要なメッセージが表示される場合があります。 |
| |
必ずしもポップアップウィンドウが表示されるわけではありません。それでは別の例を見てみましょう。 |
| |
このスクリプトでは、作成者はテーブルを開き、分析を作成し、ログにメッセージを出力しようとしています。 |
| |
このスクリプトを実行すると、分析が生成されなかったことがすぐにわかります。 |
| |
もう一度ログを確認します |
| |
データ テーブルに見つからなかった列があったことがわかりますが、スクリプトは続行され、メッセージをログに出力しました。 |
| |
ここで重要なのは、常にログを確認することです。特に、期待どおりに動作しない場合は必ずログを確認してください。列名のスペルミスといった単純なミスかもしれません。 |
| |
現在のデータテーブルの概念は、しばしばアクティブテーブルと呼ばれます。しかし、なぜテーブルがアクティブまたは現在のデータテーブルと呼ばれるのでしょうか?また、スクリプトにとってなぜ重要なのでしょうか? |
| |
テーブルが開かれたり、作成されたりするなど、何らかの操作が行われると、そのテーブルは現在のデータテーブルになります。しかし、スクリプト作成者が予期していなかった、実行時にテーブルが現在のデータテーブルになる他の方法もあります。 |
| |
JMPがバックグラウンドで処理するタスク。例えば、JMPは数式を評価したり、ウィンドウを更新したりする必要があるかもしれません。 |
| |
これらのバックグラウンドプロセスは、実行時にアクティブになるはずだったテーブルとは異なるテーブルを生成する可能性があります。その結果、スクリプトが失敗したり、最悪の場合、JMPが間違ったテーブルを使用していることに気付かなかったりする可能性があります。 |
| |
そこで、いくつかご紹介します |
| |
データテーブル固有の参照を使用してスクリプトを作成するためのベストプラクティス。これにより、実行時にどのテーブルがアクティブであるかに関係なく、正しいテーブルが使用されることを確認できます。 |
| |
この例では、特定のデータ テーブルに二変量呼び出しを送信して、そのテーブル内のデータが分析に使用されるようにする方法を示します。 |
| |
新しい列を特定のデータ テーブルへのメッセージとして使用することもできます。これにより、新しい列が目的のテーブルに作成され、現在のテーブルには移動されなくなります。 |
| |
オプションのデータテーブル参照も使用できます。ここでは、列の参照にこれをどのように使用するかを示します。列の参照については、後ほど詳しく説明します。 |
| |
関数ではオプションのデータ テーブル参照を使用することもできます。これが使用できるのは、for each row と summarize の 2 つです。 |
| |
また、データテーブルの使用は避けることをお勧めします。本番スクリプトでは、現在のデータテーブル関数を使用してデータテーブルへの参照を割り当てます。この例では、2つのデータテーブルを結合し、そのテーブルへの参照を割り当てます。 |
| |
結合によって作成されたテーブルへの参照を返します。そのため、現在のデータテーブルに代入するのではなく、結合の作成時に参照を代入する必要があります。 |
| |
ここでは、結合を呼び出すときに割り当てを行い、これを実行すると |
| |
確かに、新しい DT 変数は目的のテーブルを参照しており、現在のテーブルによって影響を受けないことがわかります。 |
| |
JSL 変数を使用して列を識別することは一般的なタスクであり、どの方法を使用するかは目的の使用法によって異なります。 |
| |
column関数は、列全体への参照を返します。列名(文字列または文字列変数)など、さまざまな引数を取ります。 |
| |
インデックス、またはインデックスを表す数値変数。添字を付けることで、特定の行の列の値を参照できます。 |
| |
列関数を使用できる場所としては、プラットフォーム呼び出し、列へのメッセージの送信、列への変数参照の割り当てなどがあります。 |
| |
as column関数は現在の行の値への参照を返します。 |
| |
指定された列の。列関数と同じ引数をすべて受け入れますが、JMPでは、特に指定しない限り、現在の行は常にゼロになることを理解しておくことが重要です。 |
| |
as column 関数は、数式、for each row、select where などで最適に機能します。これらの関数は、各行で評価を行うため、行を制御するように設計されています。それでは、例を見て、その意味を理解しましょう。 |
| |
ここではサンプルデータテーブルを開いています。列名にJSL変数を割り当て、select whereでcolumn関数を使用しようとしています。 |
| |
さて、このスクリプトを実行すると、行が選択されていないことがわかります。なぜでしょうか?select whereは各行で評価されるためです。 |
| |
添字なしでcolumn関数を使用すると、行は選択されません。column関数は列全体への参照を返すため、データの列全体が14になることは決してありません。 |
| |
したがって、解決策としては、行の添え字を指定した列関数を使用する (この行の添え字は、select where が評価されている間の現在の行を意味します) か、または as column 関数を使用して行を選択することです。 |
| |
JSL変数を数式で使用すると、いくつかの理由で問題が発生する可能性があります。JSL変数の有効期間は現在のJMPセッション内で制限されており、変数の値が変化すると数式の結果も変化します。 |
| |
また、数式エディタで数式を確認しない限り、問題があることに気付かない可能性があります。 |
| |
それでは、例を見てみましょう。ここでは、データテーブルを開いて、合計したい列のリストを作成しています。 |
| |
新しい数式列を作成し、合計関数でJSL変数を使用しています。それでは実行してみましょう。新しい列が作成され、データが入力されているのが確認できます。数式エディタを見てみましょう。JSL変数が合計関数で使用されているとは言っていませんでした。 |
| |
そして、それを無視して、依存する列の 1 つに変更を加えると、列の式が自動的に更新されないことにも気付きました。 |
| |
それでは、JMP を保存して閉じ、このテーブルを保存して JMP を閉じます。 |
| |
そしてまた始めます。 |
| |
このJSL変数の有効期間は、前回のJMPセッションまでに限定されていたことを思い出してください。それでは、テーブルを開いて何が起こるか見てみましょう。 |
| |
変数…列の式がまだ再評価されていないことに気づきました。確認してみると、JSL変数はまだ表示されていますが、その下に赤い線が表示されています。マウスオーバーすると、名前が未解決であることを示すエラーが表示されます。 |
| |
数式を再評価しようとするとエラーメッセージが表示され、エラーを無視するとすべてのデータが欠損値になってしまいます。どうすれば修正できるでしょうか? |
| |
数式で変数を使用する場合は、数式を評価する前に、JMPに変数をその値に置き換えるよう指示する必要があります。substitute関数を使うこともできますが、今日は式関数を使って説明します。それでは、この表を閉じましょう。 |
| |
テーブルの新しいコピーを開き、列のリストを再確立します。 |
| |
それでは、これをどのように回避するかを見てみましょう。 |
| |
したがって、eval 式関数は、JMP に、引数内の EXPR 関数でラップされたすべての変数を評価して置換するように指示します。 |
| |
そして、評価されていない式を返します。つまり、このコードでは、JMPはSATスコアという式を列のリストに置き換えます。 |
| |
では、このセクションだけ実行して何が起こるか見てみましょう。sum関数に変数ではなく、合計したい列のリストが渡されているのがわかります。 |
| |
しかし、実際には列は作成されていません。単にこの式が返されただけです。そのため、これを評価するために、eval式関数の周りにeval関数を追加します。 |
| |
これにより、JMPは置換後に新しい列の式全体を評価します。つまり、メールには「eval式によって返された値を実行してください」と書いてあることになります。つまり、これは「eval式によって返された値を実行してください」という意味です。 |
| |
それでは実行してみましょう。列が作成され、期待どおりのデータがあることがわかります。 |
| |
そして、数式には変数はなくなり、列のリストが含まれるようになりました。 |
| |
依存列のデータに変更を加えると、数式が自動的に更新されるようになりました。 |
| |
それでは、次に、避けるべきいくつかの間違いについて、ジャスティンに話をバトンタッチします。 |
| ジャスティン・チルトン |
さて、よくある間違いの一つは、列のプロパティを設定するときに、構文が少し複雑になることがあるということです。詳細に入る前に、 |
| |
列のプロパティの観点から列とは何かについてお話ししましょう。基本的に列とは |
| |
このプロパティ情報のリポジトリです。構文チェックは行われません。 |
| |
指定した内容は正しく、これにより、必要なあらゆるものを保存できるようになります。これは、プロパティの利用者が、JMPプラットフォーム、列プロパティの使用、あるいはJSLアプリケーションなど、特定の形式での保存を期待しているためです。 |
| |
それでは簡単な例を見てみましょう。 |
| |
ここで、テスト用に「列プロパティ」というテーブルを開きます。「NPN1」という列と「test」という列があります。この列には仕様の制限とアクセスプロパティが設定されていますが、 |
| |
試験に仕様限界特性を追加します。つまり、私たちが考えているのは |
| |
は、仕様限界列のプロパティを設定するための正しい構文です。これを実行してもエラーは発生しませんが、 |
| |
列を見てください。その列には仕様制限があります。 |
| |
できますが、正しくないことがわかります。仕様限界値を使った工程能力分析を依頼したところ、 |
| |
これを実行すると、NPN1については1つ取得できますが、テスト列については1つ取得できません。これは、テスト列の仕様限界プロパティに保存されている値が正しくないためです。 |
| |
すでにプロパティ仕様の制限値の設定方法を知っている場合は、これを行う1つの方法は、 |
| |
正しいとわかっている列NPN1にプロパティメッセージを送信するだけで済みます。つまり、この1行を実行するだけで正しい構文が得られます。 |
| |
これは実際には個別の引数ではなくリスト形式で記述する必要があることを示しています。getプロパティの使い方がよくわからない場合は、正しいとわかっている列に移動して列プロパティをコピーするという方法もあります。 |
| |
これをスクリプトに貼り付けると、列プロパティの追加と設定プロパティがいくつかあることがわかります。列プロパティの追加は、複数の設定プロパティをまとめて処理する方法です。これを削除して、追加のアクセス権限を削除できます。 |
| |
プロパティを削除したら、このsetプロパティを使ってsend演算子でテスト列に送信します。これを実行すると、 |
| |
仕様制限が上書きされましたが、仕様制限を使用して同じディストリビューションを実行することでそれを確認できます。 |
| |
ご覧のとおり、両方の列の工程能力分析が示されています。これは仕様限界を取得する方法の一例に過ぎませんが、JSLで適用して構文を取得する必要があるすべての列プロパティに同じことが当てはまります。 |
| |
次に取り上げる間違いは、ディスパッチコマンドの操作です。では、ディスパッチコマンドとは何でしょうか? |
| |
これは、赤い三角形のメニューの「スクリプト ウィンドウに保存」または「クリップボードに保存」を実行したときに、保存されたスクリプトに表示されるものです。 |
| |
参照線などを追加したり、アウトラインボックスを閉じるなど他の変更を加えたりするときに表示されます。このコマンドは、JMPの内部的な方法として開発されました。 |
| |
カスタマイズによって、ユーザーが |
| |
これを動的変数でカスタマイズします。つまり、ディスパッチコマンドの引数の一部はJSL変数を受け付けないということです。それでは、それが起こり得る例を見てみましょう。これがスクリプトです。 |
| |
テーブルと、後ほど使用する文字列変数です。そして、これは基本的にスクリプト保存ウィンドウから返される値です。これを実行すると、 |
| |
測定軸の最小値、最大値、増分を設定するディスパッチコマンドが |
| |
ここでは0から1.4に設定されています。これで、ディスパッチコマンドが |
| |
アウトラインボックスのタイトルですが、このアウトラインボックスのタイトルは実際にはy入力値に基づいています。つまり、これをユーザーからの動的な入力にしたい場合、この変数だけを使用します。この変数をyに使用できます。 |
| |
しかし、その列の名前もここに使用する必要があります。これを実行すると、軸の設定が0.4から1.2に正しく設定されていないことがわかります。これは、送信したデータが処理されていないことを意味します。 |
| |
これを解決するにはいくつか方法があります。まずは、先ほどウェンディが話したeval式を使う方法です。ここでも同じeval式を使っていますが、前の例で試した連結をラップしたいのです。 |
| |
ここ。 |
| |
eval式はこれを全て評価するという意味です。eval EXPRを実行すると、 |
| |
全体を連結された文字列に置き換え、evalを実行するときに覚えておいてください。 |
| |
この式を実行します。つまり、0から1.4までの範囲が計算されます。これが一つの方法です。 |
| |
しかし、それでも少し扱いにくい場合があります。ディスパッチコマンドを実際にどのように操作すればよいのか、まだディスパッチコマンドを使用しているため、その動作を理解している必要があるからです。そのため、最も一般的な方法は、このディスパッチコマンドを完全に削除することです。 |
| |
そこで、ディスプレイボックスの添え字付けと呼ばれるものを使います。ここでは、ディスパッチコマンドを削除してこれを実行し、元の軸設定に戻します。 |
| |
では、見た目だけでは書き方がよく分からないので、まずはこのアウトラインボックスのアイコンを右クリックします。 |
| |
ツリー構造を編集して表示します。すると、このアウトラインボックス内の表示ボックスのツリー構造が表示されます。このアウトラインボックス内で、変更したいのは軸ボックスです。このアウトラインボックス内には軸ボックス1があります。 |
| |
それではスクリプトを書いてみましょう。このレポート関数を使って、プラットフォームのレポートレイヤー(OBJ1)を取得します。 |
| |
次に、列名に基づいて、アウトライン ボックスのタイトルを取得するために下付き文字を使用します。 |
| |
そして、その中で、私たちは、JMP の将来のバージョンで変更があった場合に問題が発生する可能性が低くなるように、できるだけ具体的にしたいと考えています。 |
| |
そこで、その中で、軸ボックス 1 が必要になり、それがその軸ボックスを取得する方法です。その後、ディスパッチ コマンドから同じ情報を取得し、それを軸ボックスに送信するメッセージに変換することができます。 |
| |
ここで、軸の設定が 0 から 1.4 になっていることがわかります。 |
| |
より強力な方法として、XPathを使う方法があります。XPathも同じ機能を持ちますが、少し複雑になる場合があります。しかし、ボックスに関する基礎データを使用できるため、JMPの将来のバージョンではより柔軟な対応が可能になります。 |
| |
最後に取り上げる間違いは、グローバル名前空間のみを使うことです。 |
| |
ご存知ないかもしれませんが、保存場所を指定せずにシンボルを作成すると、グローバル名前空間に保存されます。これは、個人的な用途で何かモックアップを作成するような簡単なスクリプトに最適です。 |
| |
ただし、同僚に送信するスクリプトや公開するスクリプト、コミュニティで公開するアドインの場合は、この方法は適さない可能性があります。 |
| |
JMPにおけるスコープと名前検索の仕組みについて、もう少し詳しく説明します。この図の一番下から見ていきましょう。ローカルスコープは、関数やローカルボックスなど、任意の数のスコープを持つことができます。 |
| |
つまり、シンボルが見つからない場合、または書き込みまたは読み取りに応じてローカルに指定しなかった場合、 |
| |
次にhereスコープがあります。これは基本的にファイルごとに1つ存在します。そしてグローバルスコープは、基本的にJMPセッションの1つのスコープです。そして右側には名前空間スコープがあります。これは、明示的に検索してアクセスする必要があります。 |
| |
アクセス。例を見てみましょう。これはすべてのシンボルを削除します。配置場所を指定していないので、グローバル変数に配置されます。つまりxは5です。しかし、もし誰かが「まあ、私も」というスクリプトを書いていたらどうなるでしょうか? |
| |
持っている |
| |
使いたい変数xです。どこに格納するかは指定しません。なので、10に設定します。 |
| |
しかし、スクリプトに戻ると、これはおそらくあなたが設定した変数であり、ボタンにいくつかのコールバックがあります...ボタン |
| |
その変数に依存するアクションを実行し、それを使用しようとすると、変数が変更されますが、これはおそらく望ましくない結果です。 |
| |
では、この問題に対処するにはどうすればよいでしょうか?最も簡単な方法は、names default to here(1) を使うことです。これは、明示的にグローバルスコープを指定するまで、何もグローバルスコープに入らないことを意味します。それでは、見ていきましょう。 |
| |
この |
| |
例です。つまり、この default という名前をここ(1)に追加しただけです。これは…通常はスクリプトの先頭に記述しますが、実際にはどこにでも記述できます。 |
| |
シンボルを整理して、変数xを5に設定します。そしてここに別の聖句があります。 |
| |
は「あなたのxにアクセスしたい」と言っていますが、実際にはこのxはこの名前空間内のこのxにアクセスできません。つまり |
| |
スクリプトの一部をコピーして、X を 50 にしてみましょう。 |
| |
右側のスクリプトのXは50ですが、左側のスクリプトのXには影響しません。つまり、これはシンボルを他のスクリプトやアプリケーションから簡単に区別できる優れた方法です。 |
| |
もう一つの選択肢は、カスタム名前空間を使うことです。これは少し高度な方法ですが、非常に強力な機能です。さて、ここでもう一度… |
| |
シンボルを作成し、新しい名前空間を作成し、その名前空間内に変数xを設定して表示します。つまり、その値は5です。 |
| |
ここにもう一つスクリプトがあります。これはあなたのスクリプトの一つで、ご存知の通りです |
| |
myNSは存在します。ですから、それにアクセスしてみるのは可能です。名前を知っているので、問題ありません。しかし、誰かがあなたの知らないうちにあなたのシンボルを変更する可能性ははるかに低いです。 |
| |
このシンボルを変更しても 10 のままですが、X だけを実行すると、名前空間の X の結果にはまったく影響がありません。 |
| |
ウェンディに話を戻します。ウェンディは、見落とされがちなリソースについて教えてくれる予定です。 |
| ウェンディ・マーフリー |
ジャスティンさん、ありがとうございます。JSLについてもっと詳しく知るためのリソースはたくさんあり、その多くは無料です。ここでは、JSLについてもっと詳しく知るための一般的なサイトへのリンクをいくつかご紹介します。 |
| |
技術サポートも提供しており、このテーマに関する書籍もいくつかご用意しております。もちろん、トレーニングリソースやプランもぜひご活用ください。 |
| |
JMPコミュニティのこのプレゼンテーションに関連した論文もぜひご覧ください。本日は時間がなくて取り上げられなかったミスもいくつか取り上げています。ご視聴ありがとうございました。 |