使用多个ppl("branch")构建Pipeline报错,求简洁解决方案
mlr3pipelines分支管道重复ID错误的解决问题
我想要构建如下Pipeline:
graph <- as_learner( ppl("branch", pos(c("nop", "scale", "pca"))) %>>% po("encode", method = "one-hot") %>>% ppl("branch", lrns(c("regr.xgboost", "regr.ranger"))) )
运行时出现错误:
Error in gunion(list(g1, g2), in_place = c(TRUE, TRUE)) : Assertion on 'ids of pipe operators of graphs' failed: Must have unique names, but element 9 is duplicated.
我认为错误源于重复使用带"branch"参数的ppl()函数。我希望保持代码简洁,不想手动使用gunion()构建分支管道段,请问是否有可行的解决办法?
解决办法
核心问题是两次调用ppl("branch")时,默认生成的节点ID出现了重复。只需给每个branch管道指定唯一的ID参数即可解决,无需手动用gunion()重构。
修改后的代码如下:
graph <- as_learner( ppl("branch", pos(c("nop", "scale", "pca")), id = "preproc_branch") %>>% po("encode", method = "one-hot") %>>% ppl("branch", lrns(c("regr.xgboost", "regr.ranger")), id = "learner_branch") )
原理说明
ppl("branch")默认会生成一系列以通用前缀命名的节点,多次调用时会触发ID冲突- 显式指定
id参数后,每个分支管道下的子节点都会基于这个自定义ID生成唯一名称,彻底避免重复问题 - 这种方式完全保留了你原本简洁的链式管道写法,不需要额外的复杂重构
内容的提问来源于stack exchange,提问作者ChickenTartR
相关产品推荐
相关产品推荐

