使用 veribles 创建/添加新列大家好,我很抱歉标题让人困惑。我不知道该如何表述。
我的问题是:我有一个代码,其中我使用长条件添加新列。
除一个参数发生变化外,所有列的条件都相同。
有没有一种方法,不是每次都编写完整的代码和具有新参数值的条件,而是创建一个模板(如函数),我将使用变量而不是参数,每次我将向该模板发送新列的条件所需的值?
自动化和脚本基础数据分析与建模回复:使用 veribles 创建/添加新列你可以使用函数或表达式来实现这样的效果
https://www.jmp.com/support/help/en/18.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#ww339382
https://www.jmp.com/support/help/en/18.0/#page/jmp/advanced-functions.shtml#
使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式
回复:使用 veribles 创建/添加新列无需编写任何代码。
自 JMP 18 以来,这变得非常简单 - 只需查看讨论/公式/ - 功能#3。
简而言之:
选择要用作输入的列,然后右键单击列标题并单击
新公式列/ 
最后一步,输入公式并点击
[我选择了 128 列,所以创建 128 。
如果您选择了 N 列,它将创建 N 列:)
回复:使用 veribles 创建/添加新列如果您想通过新公式右键菜单反复使用完全相同的公式,您可以创建自己的“自定义函数”并启用“转换类别”选项以使其显示在菜单中。
重新启动后必须再次执行代码,因此将其包含在插件或启动脚本中。
Names Default To Here( 1 );
myAdd =
New Custom Function(
"custom",
"Add",
Function( {x, y = 1},
x + y - 1
)
);
myAdd << Transform Category( 1 );来自脚本索引:

但这种方法非常“静态”。要获得更改参数的可能性,您必须在此处投票:
新的公式列菜单:用户定义的迷你 GUI
回复:使用 veribles 创建/添加新列以下是一个将添加数字的函数示例。它缺少一些检查来判断是否为“好”函数,但确实提供了必要的概念,即必须评估可能发生变化的值(在本例中为要添加的列名和数字)(请参阅我之前提到的将一个表达式插入另一个表达式... )
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
add_num_to_col = Function({dt, colname, num_to_add}, {Default Local},
new_col = Eval(EvalExpr(
dt << New Column(colname || " add " || char(num_to_add), Numeric, Continuous, Formula(
Expr(NameExpr(AsColumn(dt, colname))) + Expr(num_to_add)
));
));
return(new_col);
);
col1 = add_num_to_col(dt, "height", 10);
col2 = add_num_to_col(dt, "height", 20);
col3 = add_num_to_col(dt, "weight", 5);
Write();
有时使用 Eval(Substitute()) 是更简洁、更容易理解的解决方案,它看起来像这样
add_num_to_col = Function({dt, colname, num_to_add}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column(colname || " add " || char(num_to_add), Numeric, Continuous, Formula(
_colname_ + _num_to_add_
))),
Expr(_colname_), Name Expr(AsColumn(dt, colname)),
Expr(_num_to_add_), num_to_add
));
return(new_col);
);回复:使用 veribles 创建/添加新列结合前面的方法,略作修改:
- 创建自定义函数*)
- 将其添加到公式类别
- 右键单击列标题,然后单击“新建公式列” /

- 使用新公式
- ...并手动输入参数:

*)
Add Custom Functions(
New Custom Function(
"custom",
"add++",
Function( {column, num_to_add},
{Default Local},
column,
num_to_add
),
<<FORMULA category=""></FORMULA>The benefit: the user can enter specific parameters for every new column.
The disadvantage: no <STRONG><EM>批</EM> </STRONG>mode like in the previous posts.<BR /><BR />kind of disadvantage: JMP doesn't <EM>解决/替换</EM> the formula, it keeps it as <FONT face="courier new,courier">添加++(...)</FONT>.<BR /> To keep it alive the formula definition has to be executed again after a restart of JMP - and maybe: shared with colleagues.
回复:使用 veribles 创建/添加新列谢谢大家的帮助。
我有一个新的相关问题,也许有人可以向我解释。
我使用以下方法删除特定列中没有数据的行:
dt << 选择其中(缺少(列(dt,col_name)[row()]));
*结果,它确实删除了正确的行,但同时也删除了列中的值。有人能指出错误吗?
此处附上脚本本身:
回复:使用 veribles 创建/添加新列Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
New column(col_name); // maybe another column with the same name?
new_col = New column(col_name, Formula(if(:height>60,1 )));
// get the correct column name - uncomment to make it work
//col_name = new_col << get name();
dt << select where( Is missing( Column( dt,col_name )[row()] ));
wait(1);
dt << delete rows;
回复:使用 veribles 创建/添加新列我不建议使用字符串来引用列。这种情况经常发生,实际的列是通过添加“2”创建的 - 而字符串将指向另一列。
生成列时,您会获得该列的句柄。只需使用此句柄 - 它将引导您到正确的列:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
new_col = New column(col_name, Formula(if(:height>60,1 )));
dt << select where( Is missing( new_Col[] ));
回复:使用 veribles 创建/添加新列我也不喜欢用[]用当前值As column( col_name) 替换列 Column( col_name) 。
:col 可以同时执行这两项操作 - 我从@jthi那里学到了:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
new_col = New column(col_name, Formula(if(:height>60,1 )));
myCol = Name Expr(As Column(new_col)); // very cool trick (c) Jarmo
Show(Name Expr(myCol));
dt << select where( Is missing( myCol ));