リスト内の各項目に対する任意の操作(関数など)リストを反復処理するのではなく、リストの各アイテムに同じ関数を適用するより簡単な方法はありますか?
例えば:
stringlist = {"1", "2"};
numericlist = {};
for (i = 1, i<=N Items(stringlist), i++,
numericlist[i] = Num(stringlist[i])
);
show(numericlist);ただ言うような、もっと簡単なものはありますか?
numericlist = Num(stringlist);
しかし、これは明らかに機能しません。 その他の方法で?
PS JMP16で新しく追加されたForEach関数が見つかりました。残念ながら、私はまだJMP15を使用しています。
スクリプティングRe:リスト内の各項目に対する任意の操作(関数など)そのような場合は、Parse()を使用することで、少なくとも変換のループを回避できる可能性があります(ただし、文字列をループする方が高速な場合があります)。
Names Default To Here(1);<BR />str = "120, 130, 160, 120, 300, 200";
numList = Parse("{" || str ||"}");
Show(numList[1], numList[2]);データテーブルとして:
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200"}
)
)
);
dt << New Column("numlist", Expression, << set each value(Parse("{" || :Column 1|| "}")));
numListList = dt:numList << get as matrix;
Show(numListList, numListList[1], numListList[1][1]);Re:リスト内の各項目に対する任意の操作(関数など)みんなありがとう!
これは素晴らしいです。
私は実際にイントラネットでJMP16を見つけました。IT部門は、インストール手順を準備して正式にリリースしているところだと言いました。 だから私は先に進んでとにかくそれをインストールしました。
私の実際のタスクはもう少し複雑でした。例として、ある例では、タイプの文字列のリストがありました。
"120, 130, 160, 120, 300, 200"
実際のデータは、各行にそのタイプの文字列が含まれる列になります(はるかに長い)
私はそれを数字のリストのリストに変える必要がありました。 そのため、その列を初期リストに読み込んでから、この初期リストにWords()を適用して文字列のリストのリストを取得し、次にNum()を適用して各文字列を数値に変換する必要がありました。 これは、2つのネストされたループを意味します。
今のところ、2つのFor Eachループを使用してこれを実行しましたが、ここに投稿した提案を調べてみましょう。 Expr()を理解することはできませんでした-もう一度チャンスを与える必要があると思います。
ありがとう!
Re:リスト内の各項目に対する任意の操作(関数など)@miguello 、
@jthiあなたに素晴らしい答えを与えました(賞賛)。私もJMP16の関数TransformEachにとても興奮していました。
以下は、JMPのはるか以前のバージョン用に作成され、JMP13用に公開されたスクリプトの変更部分です。 以前の同僚の多くはLFUNC関数を使用していました(名前はlist関数の省略形です)。JMP16の名前「TransformEach」と構文はとても良いです。 ただし、リスト項目のいずれかが指定された変換に対して正しくないタイプである場合は、エラーが返されるだけです... Try()関数で修正できます。
念のため、JMP 16に到達するまで、これは役立つかもしれません。私はそれを投稿しています。コードの関数定義部分をファイルに保存し、必要なスクリプトでInclude()を使用するだけです。
// JSL Companion: Applications of the JMP Scripting Language
// Title: JSLC_CustomListFunctions.jsl
// Version: Windows JMP® 13.2.0
// Purpose: Provides examples of writing user functions.
/*Notes:
These functions are provided for learning as well as utility.
See Chapter 5 and 5_Extra_CustomListFunctions.jsl");
The script will define 2 functions. After each is a comment
block /*: Usage & Test examples ... --- end Test*/. Remove
The comment block and run the examples one line at a time. Open
the embedded log or have the log window visible to see
the results.
Motivation:
As seen in Chapter 5, a numeric function on a single layer
list of numbers, or a vector, or a matrix, will return the
same object with the function applied to each item. For example,
xx = Sqrt({1,2,3,4,9}); //xx = {1, 1.4142135623731, 1.73205080756888, 2, 3}
We have suggested that the same apply to String functions (that operate
on a single item) on a list of text. What we would like is
xx = Substr({"Quaker", "Minnesota", "Nebraska"}, 1,1); would return
xx = {"Q", "M", "N"}. However, currently most JMP String functions do not
allow list agruments.
Functions defined here, are:
- LFunc( mylist, expr); where expression is like expr(Substr(x,1,1)).
{LIKE function notes removed}
LFunc can save writing for-loops, Like save looking up the REGEX syntax.
*/
//------LFunc-------------------------------------------------------------------
Lfunc = Function( {xList, fExpr/*ex. Expr(Contains(x,"h"))*/},
{x = {}, i = 1, errCode = 0, errStr = "\!NError bad argument", newExpr},
If( !Is List( xList ),
errCode = 1
);
If(
Type( Name Expr( fExpr ) ) == "Name",
//if Name then JMP does not recognize the function
tmp = Trim( Char( Name Expr( fExpr ) ) );
//extract the function and check if it is contained in the global namespace, if not error!
If( Namespace( "global" ) << Contains( Word( 1, tmp, ":(" ) ) == 0,
errCode = errCode + 2
);,
Type( Name Expr( fExpr ) ) != "Expression", errCode = errCode + 2
);
//catches typos, returns Name if not a valid function
//catches typos, returns Name if not a valid function
If( !Is Expr( Name Expr( fExpr ) ),
errCode = errCode + 2
); //catches syntax
If(
!errCode,
For( i = 1, i <= N Items( xList ), i++,
newExpr = Substitute( Name Expr( fExpr ), Expr( x ), xList[i] );
Insert Into( x, Try( newExpr, Empty() ) );
),
errCode == 1, Write( errStr || "(1) not a list \!N" ),
errCode == 2, Write( errStr || "(2) not a valid expression \!N" ),
errCode == 3, Write( errStr || "s (1) is not a list and (2) is not a valid expression \!N" )
);
x//return x
;
); //End Lfunc
//------------------------------------------------------------------------------
//Usage & Test ...remove the slash asterisk and run in segments, results are in the log
//------------------------------------------------------------------------------
myList1={"john", "harry", "huh","ah ha", "xyx", , "a", "h", 7, [1,7]};
/* example below returns a list of numeric values, one value for each item in the list
n =>1st location of h, 0 => does not contain "h", Empty() => the item is not
a valid argument for that expression.
*/
zz1 = Lfunc(myList1,Expr(Contains(x,"h")));
show(zz1);
myList2={"john", "harry", "huh","ah ha", "xyx", , "a", "h"};
zz2=Lfunc(myList2, Expr(Uppercase(x)));
show(zz2);
//-----------------------------------------------------------------------------------------
/* returns a list of how many words are in each string
[] -> no occurrences
Empty() => the expression is not valid for that item.
*/
zz3 = Lfunc(mylist2, expr(nitems(words(x))));
show(zz3);
//-----------------------------------------------------------------------------------------
/* This specified function requires numeric arguments
Empty() => the expression is not valid for that item.
A numeric function applied to a matrix returns a matrix
of the results applied on each element in the matrix.
Only the last 2 items are valid arguments for Log()
*/
zz4 = Lfunc(mylist1, expr(log(x)));
show(zz4);
//----------------Error Checking---------------------------------------------------------------
/* Uncomment the code below to show the error capture and reporting */
//zz = Lfunc("oh johhny", Expr(Contains(x,"h")) ); //not a list
//zz = Lfunc({"oh johhny"}, Expr(Contians(x,"h")) ); //type not a valid expr due to typo
//zz = Lfunc("oh johhny", Expr(Contians(x,"h")) ); //not a list and not a valid expr
Re:リスト内の各項目に対する任意の操作(関数など)すでにお気づきのように、JMP16はForEachとTransformEachでこれを支援します。 これを何度も行う必要がある場合は、タスクを実行するためのカスタム関数を作成できますか?
Names Default To Here(1);
charToNum = function({tempList}, {Default Local},
newList = {};
For(i = 1, i <= N Items(tempList), i++,
newList[i] = Num(tempList[i]);
);
return(newList);
);
a = {"1", "2"};
b = charToNum(a);
show(b);
編集:
さまざまな変換を処理できる、より複雑な関数を作成することもできます。 ほとんどの場合、やり過ぎになる可能性があり、実際にはお勧めしません(変換ごとに異なる関数を作成するだけです)。
これがどのように行われるかの一例です:
Names Default To Here(1);
transformList = function({tempList, transformExpression}, {Default Local},
newList = {};
For(i = 1, i <= N Items(tempList), i++,
val = tempList[i];
newList[i] = transformExpression
);
return(newList);
);
a = {"1", "2", "100"};
b = transformList(a, Expr(Num(val)));
c = transformList(b, Expr(Multiply(val, 10)));
d = transformList(c, Expr(Char(val)));
Show(a,b,c,d);
//can also use custom functions with transformList
padZero = function({tempValue}, {Default Local},
if(Length(tempValue) < 2,
tempValue = "0" || tempValue;
);
return(tempValue)
);
e = transformList(a, Expr(padZero(val)));
Show(e);
f = transformList(e, Expr(Length(val)));
Show(f);