2

データ オブジェクトをテキストに出力するにはどうすればよいですか。

crossTable = markMe.As[CrossTablePlot]()
print crossTable.Data

戻り値:

0x000000000000002C の Spotfire.Dxp.Application.Visuals.VisualizationData オブジェクト [Spotfire.Dxp.Application.Visuals.VisualizationData]

私も試しました:

for text in crossTable.Data:
    print text

エラーを返します:

Microsoft.Scripting.ArgumentTypeException: 非シーケンス型の繰り返し

最終的にアイテムをマークできるように、プロット データを取得するにはどうすればよいですか?

https://docs.tibco.com/pub/doc_remote/spotfire/6.5.0/api/?topic=html/P_Spotfire_Dxp_Application_Visuals_Visualization_Data.htm

4

1 に答える 1

5

あなたの問題は、レコードのコレクションではなく、行の値のコレクションを保持する列のコレクションである視覚化からデータ テーブル自体を取得していることです。

以下はあなたをそこに連れて行くはずです。列 "test1" が 1 から 6 までの値を持つ 6 行を保持するデータ セットを使用しました。

以下のコードの全体的な流れは次のとおりです。

  1. ビジュアルからデータ テーブルを取得する
  2. 設定変数
  3. 行の値について、対象の列をループします
  4. 項目をマークする必要があるかどうかを判断するには、いくつかの比較を使用します。
  5. テストに合格したすべてのアイテムにマークを付けます。

コード:

from Spotfire.Dxp.Application.Visuals import CrossTablePlot
from Spotfire.Dxp.Data import IndexSet
from Spotfire.Dxp.Data import RowSelection
from Spotfire.Dxp.Data import DataValueCursor
from Spotfire.Dxp.Data import DataSelection

##Get our Data Table from our graph. Data Tables hold marking relations. 
##Visuals just point to a marking set you specify 
##and interact with it in the UI based on their DataTable.
crossTable = markMe.As[CrossTablePlot]()
crossSource = crossTable.Data.DataTableReference

##Get a Row Count
rowCount = crossSource.RowCount

##Index Set of all our rows
allRows = IndexSet(rowCount,True)

##Empty Index Set to fill with our desired markings
rowsToMark = IndexSet(rowCount,False)

##Pick the column we're interested in examining for values.
##You can create multiple cursors to look at multiple columns.
##Specify the name of your column. Mine is called test1.
colCurs = DataValueCursor.CreateFormatted(crossSource.Columns["test1"])

##Optional: Loop through to determine average value
colTotal = 0
for row in crossSource.GetRows(allRows, colCurs):
    colTotal += int(colCurs.CurrentValue)
colAvg = colTotal/rowCount

##loop through our rows and add what we want to our index.
for row in crossSource.GetRows(allRows, colCurs):
    ##Get the index of our current row in the loop
    rowIndex = row.Index

    ##Compare values and if TRUE then we add this row to our index
    ##Instead of hard coding you can refer to a document property
    ##or any other source of data like the average of your column.
    ##Optional: Print our current value to debug
    #if int(colCurs.CurrentValue) > (2.5):
    if int(colCurs.CurrentValue) > colAvg:
        print colCurs.CurrentValue + " was added to the index! =]"
        rowsToMark.AddIndex(rowIndex)
    else:
        print colCurs.CurrentValue + " was not added to the index... =["

##Set our marking equal to our rowsToMark index
Document.ActiveMarkingSelectionReference.SetSelection(RowSelection(rowsToMark),crossSource)

ソース:

私自身の Spotfire クライアントと API の知識

http://www.bearonspotfire.com/mark-rows-and-unmark-rows-using-scripts-in-spotfire

bearonspotfire は、スクリプトを作成するための優れたリソースでもあります。私は彼がしたことを取り入れ、あなたのアプリケーションのために少しひねりを加えました. 彼はドロップダウンを使用してアイテムをマークします。

diablo8226 の質問の編集:

フラックス (OP) と私は、問題のビジュアライゼーションの入力パラメーターとして markMe が含まれているという同じ前提で実行していました。スクリプト入力ウィンドウの下にある [追加...] ボタンをクリックして、これを含めることもできます。markMe または任意の名前を使用できます。タイプとしてビジュアライゼーションを選択し、ビジュアライゼーションを選択してください。

または、データ テーブル自体を入力して、データ テーブル ソースを取得するコードをスキップするか、以下のようなコードでテーブルを明示的に呼び出すことができます。

coll = Application.GetService[DataManager]().Tables   
crossSource = coll.Item["TABLE_NAME"]
于 2015-03-20T15:07:46.393 に答える