尝试创建一个列并用公式填充它,但出现错误。查看更多... For (j=3, j<=10, j=j+2,
ColLen=Length(Char(Column name (j)));
ColName=Left (Char(Column Name(j)),ColLen -5);
NewCol=Substr(ColName,6);
New Column(
"Delta: "||NewCol,
Numeric,
Formula (
(Column (j)- Column(j+1))
)
)
);
自动化和脚本编写回复:尝试创建一列并用公式填充它,但出现错误。@泪之皇冠,基于你原来的JSL:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(
Eval Expr(
New Column( "Delta: " || NewCol,
Numeric,
Formula( (As Column( Expr( Column Name( j ) ) ) - As Column( Expr( Column Name( j + 1 ) ) )) )
)
)
);
);我喜欢干净的 As Column("column name") 函数,它不像我的 Eval( Parse(...) ) 解决方案那样难看。
回复:尝试创建一列并用公式填充它,但出现错误。似乎工作“一次”(值没问题) - 但是(至少对于我的测试用例)变体#1在您随后打开它时报告公式错误:

变体#6 似乎解决了这个问题:

但是一旦Jmp关闭并且忘记了什么,它肯定会失败dt方法 ....
回复:尝试创建一列并用公式填充它,但出现错误。就像Column()而不是column一样有效!
回复:尝试创建一列并用公式填充它,但出现错误。就像Column()而不是column一样有效!
回复:尝试创建一列并用公式填充它,但出现错误。不工作:(
回复:尝试创建一列并用公式填充它,但出现错误。摆弄了一下之后
- 特别是:想知道为什么 #1 没有给出预期的结果:
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length,Sepal width, Petal length};
i = 2;
Eval( Eval Expr( dt << New Column( "new1", Formula( As Column( Expr( i ) ) ) ) ) ); //works but the formula is corrupted
Eval( Eval Expr( dt << New Column( "new2", Formula( As Column( Expr( Column(i) ) ) ) ) ) );
Eval( Eval Expr( dt << New Column( "new3", Formula( As Column( Expr( Char( cols[i] ) ) ) ))) );
Eval(Substitute(Expr(dt << New Column( "new4", Formula( __col__ ) )),Expr(__col__),Name Expr(As Column(i)) ));
Eval(Eval Expr(dt << New Column("new5", Formula(Expr(NameExpr(AsColumn(i)))))));
// new:
Eval( Eval Expr( dt << New Column( "new6", Formula( As Column( dt, Expr( i ) ) ) ) ) ); ...我发现了一个新的变体,不需要封闭名称表达式使其发挥作用*)
有趣的 ...
*) 工作 -直到Jmp关闭并再次启动
回复:尝试创建一列并用公式填充它,但出现错误。关于这个主题的好帖子是使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式。 在您的情况下,您确实需要更复杂的解决方案,因为如果您想要公式,则使用列索引而不是列名称(大多数时候我建议使用名称而不是索引)。 大多数时候我使用 Eval(EvalInsert()) 但替代也是不错的选择
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(3),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3])),
New Column("Column 2", Numeric, "Continuous", Format("Best", 12), Set Values([2, 3, 4])),
New Column("Column 3", Numeric, "Continuous", Format("Best", 12), Set Values([3, 4, 5])),
New Column("Column 4", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6])),
New Column("Column 5", Numeric, "Continuous", Format("Best", 12), Set Values([6, 7, 8]))
);
For(j = 1, j < 5, j = j + 2,
// ColLen = Length(Char(Column Name(j)));
// ColName = Left(Char(Column Name(j)), ColLen - 6);
// NewCol = Substr(ColName, 6);
new_col = Word(2, Column(dt, j) << get name, " ");
Eval(Eval Expr(
New Column("Delta: " || new_col, Numeric, Formula(
Expr(NameExpr(AsColumn(j))) - Expr(NameExpr(AsColumn(j + 1)))
))
));
);
您可能感兴趣的一些附加功能/消息:< < 获取列名称,单词() (还从脚本索引中搜索 Words()、Item() 和 Items()),对于每个() (如果您有 JMP16+)
回复:尝试创建一列并用公式填充它,但出现错误。@mmarchandTSI , 我同意,
Formula(Column( ...
行不通的。
使用替代品怎么样:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(Substitute(Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (__colA__ - __colB__) ) );
),Expr(__colA__),Name Expr(As Column(j)),Expr(__colB__),Name Expr(As Column(j+1)) ))
);
回复:尝试创建一列并用公式填充它,但出现错误。这是因为 Column() 是对列本身的引用,而不是对列中的值的引用。我知道如何以一种丑陋的方式做你想做的事。以下脚本将同时运行,直到有人发布更漂亮的解决方案。
Names Default To Here( 1 );
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(
Parse(
"New Column( \!"Delta: " || NewCol || "\!",
Numeric,
Formula(
:\!"" ||
(Column( j ) << Get Name) || "\!"n - :\!"" || (Column( j + 1 ) << Get Name) || "\!"n
))"
)
);
);
回复:尝试创建一列并用公式填充它,但出现错误。JSL 使用动态作用域——我相信您正在词法作用域(大多数编程语言都使用该作用域)的隐式假设下工作。
因为 JSL 使用动态作用域,所以名称的作用域解析j完成于运行,当公式计算名称时j不再在范围内,因此会出错。
为了解决这个问题,您可以预先计算部分代码,以便 JMP 没有要在列公式中查找的变量:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval( Eval Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (Column( Expr( j ) ) - Column( Expr( j + 1 ) )) ) );
) )
);
回复:尝试创建一列并用公式填充它,但出现错误。我应该指出,要从列引用转到行值,只需输入[] 。以下应该有效:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval( Eval Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (Column( Expr( j ) )[] - Column( Expr( j + 1 ) )[]) ) );
) )
);
回复:尝试创建一列并用公式填充它,但出现错误。我应该指出——要从公式中的列引用转到行值,请在列引用后放入 []
Column( 1)[] + Column( 2 )[]
回复:尝试创建一列并用公式填充它,但出现错误。很酷的技巧:)
Column(1)[]
代替
Column(1)[row()]