使用宏值作为循环参数迭代

科罗拉多州科罗拉多州 成员职位:236Maven
2020年4月编辑 帮助
大家好,

今天我第一次在RapidMiner中需要一个简单的for循环的功能。所以我看了一下循环运算符,选择了简单的“Loop”。迭代的次数取决于一些信息提取和预处理,因此我为循环准备了一个很好的属性,其中包含Integer类型的数量。我只是通过“提取宏”提取这个可爱的小整数,并把它输入迭代我的“循环”操作符参数。但不幸的是,宏值似乎是Real类型,并导致错误(从整数属性的值5中提取):

消息:必须指定参数“iterations”的值!期望的整数,但发现'5.0'。

我找不到一种方法来操作宏的数据类型,所以我有点困惑。我几乎不能相信,用可变次数的迭代进行循环是不可能的。我想做一些简单的(i = 1;i <= variableValue;我+ +)。这是目前不可能与“循环”还是我完全偏离轨道?

亲切的问候,
马蒂亚斯

答案

  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好马提亚,
    这当然是丑陋的。但是,如果在此之前使用generate宏操作符并将迭代宏放入floor()函数中,则可以避免此陷阱。将其赋值给一个新的宏(例如interterations),并将其放入循环操作符中。应该是这样:)

    问候,
    塞巴斯蒂安。
  • 科罗拉多州科罗拉多州 成员职位:236Maven
    嗨,塞巴斯蒂安,

    谢谢你-这个解决方法帮助了我。把这个问题抛在脑后,又产生了一个新的问题。
    前面提到的“循环”操作符在“循环示例”中运行,并根据当前示例中的特殊属性值执行一些操作。这就是为什么我需要将其提取到一个宏中。我的下一个问题是,我需要在循环的第一次运行中做一些特殊的事情。我通常会检查我的count变量或设置一些布尔标志。一个简单的if语句可以区分第一次循环迭代和随后的所有循环迭代。但我有点困惑,这是不可能检查“分支”操作符内的宏值。但是用“if”检查变量值正是我通常会做的。“Branch”只允许检查宏的存在,这对于一个简单的标志来说很有效。但是,由于似乎没有办法取消一个宏一旦被定义,这将只适用于我的第一个例子。我猜有一个(简单的)方法来区分循环迭代,或者有一个特殊的第一次运行,但我不知道。 Sometimes it's still hard to find the right things to do in RapidMiner analog to the things I would directly code in Java. But experience is slowly rising... not least due to your hints and help:)

    再次感谢并致以良好的问候。
    马蒂亚斯
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好,
    不幸的是没有。请帮我一个忙,在bug跟踪器的特性请求列表中添加宏的取消设置操作符以及宏值的条件。

    一个不太好的解决方法是:使用记忆/召回操作符在内存中存储一个虚拟对象。这可以被检索和删除。如果检索到但不可用,将抛出异常。如果包装在句柄Exception操作符中,则可以避免在句柄执行操作符中执行以下操作符。

    哇。那是非常黑暗的一面。


    问候,
    塞巴斯蒂安。
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好,
    顺便说一下:我们在一个项目中也遇到了同样的问题。在当前SVN版本中已添加。

    问候,
    塞巴斯蒂安。
  • 切罗基族切罗基族 成员职位:82大师
    嗨,科罗拉多州,

    一个简短的解决方案:在每个循环之前初始化宏“run”为1;在循环中,将这个宏设置为2;现在,您可以在第一次运行时使用选择子流程操作符执行其他操作。
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.0 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文








    < /操作符>









    < /操作符>

    <列出关键= "日志" >

    < / >列表
    < /操作符>







    > < /过程






    > < /过程
    < /操作符>



    < /操作符>







    > < /过程
    < /操作符>





    > < /过程
    < /操作符>



    > < /过程
    < /操作符>
    > < /过程
    最好的问候,
    chero
  • 科罗拉多州科罗拉多州 成员职位:236Maven
    谢谢你的好建议。我将这两个特性请求都添加到bug跟踪器中,即使我真的不知道该在bug描述中写些什么。
    看来切罗基的变通办法没有塞巴斯蒂安的那么黑暗;)我甚至没有考虑“Select Subprocess”操作符,因为我以前从未使用过或需要过它。但在这种情况下,它应该是有用的。我选择了另一种方式,简单地将一个flag属性添加到我的第一个示例集中,从这里开始内部循环。不是很好,但一个快速的方法来让我的进程运行::)

    Sebastian,你知道当前的SVN版本什么时候会向公众发布吗?

    最好的问候,
    马蒂亚斯


    顺便说一下:宏处理可能需要一些其他的修改。我需要一个循环的迭代计数器变量(因为%{a}不是在每次循环开始时都以1开始)。看起来很简单,在我的“循环”操作符之前“生成宏”,并在循环内通过“设置宏”增加计数。但是后者不允许我使用%{counter}+1这样的值,因为该值被解释为字符串。所以我不得不用“生成宏”覆盖现有的宏,它允许一些功能和计算。如果我在使用“设置宏”时没有完全失败,那么这种不统一的值设置和处理就有点令人困惑了。
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好马提亚,
    事实上,RapidMiner 6.0已经计划对宏提供更好的支持。然后将宏添加到元数据转换中,以允许在gui中检查和选择已经定义的宏…

    问候,
    塞巴斯蒂安。
  • 科罗拉多州科罗拉多州 成员职位:236Maven
    嗨,塞巴斯蒂安,

    听起来不错!

    但是现在,我必须再次提到关于Branch和Macros的老故事;)但这次只是在页边空白处做了一个简短的注释。
    我现在使用的是最新版本的RM,带有文本和web扩展(顺便说一下,扩展现在可以通过subversion获得),而subversion已经为Branch操作符实现了“表达式”作为条件类型。我只是无意中选择了条件类型“macro_defined”,并发现了该参数的变化。这个选择不再激活一个文本参数字段,您可以在其中输入相应的宏名称,而是显示一个“io object”选择字段。我猜这不是你想要的,你可能想要解决它。

    问候,
    马蒂亚斯
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好,
    非常感谢你的提示。

    问候,
    塞巴斯蒂安。
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好,
    正如我刚刚听到的:它已经修好了。

    问候,
    塞巴斯蒂安。
  • fstarsinicfstarsinic 成员职位:20.因素二世
    当做setMacro来更新在其他地方初始化为1的“round”变量时,这两种方法似乎都不适合我:
    • Eval (%{round} + 1)
    • Eval (%{round}) + 1

    结果要么保持1,要么以以下结果结束:"eval (eval(1 + 1) + 1)"等等。

    我以为eval应该....作为数值计算?

  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:919独角兽
    @fstarsinic

    你想干什么?你能把你的流程发给我们吗?

    你在使用吗?设置宏生成的宏?只生成宏计算表达式。你可以在这个过程中看到不同:
    <?xml version="1.0" encoding="UTF-8"?> <过程version = " 9.2.001”>
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文
    <过程扩展= " true " >
    < /操作符>
    <列出关键= " function_descriptions " >
    < / >列表
    < /操作符>
    > < /过程
    < /操作符>
    > < /过程

    问候,
    Balazs
登录注册置评。