You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言multiverse包多条件分支异常:仅首个分支有输出

问题:R语言multiverse包分支执行后仅第一个分支返回有效结果,其余返回NA

我尝试用R的multiverse包对数据应用三种不同阈值方法,代码如下:

#import packages
library(multiverse)
library(pracma) # for findpeaks function

# create random data of 100 Scores between 0 and 10
set.seed(1234)  
Score <- runif(100, min = 0, max = 10)

#create multiverse object
M = multiverse()

# Create parameter 'threshold' with 3 possible conditions
inside(M, {
Peaks <- branch(threshold,
               "two_highest" ~ as.data.frame(findpeaks(x = Score, sortstr = TRUE, minpeakdistance = 10)[1:2,]),
               "threshold_1" ~ as.data.frame(findpeaks(x = Score, minpeakheight = 3, sortstr = FALSE, minpeakdistance = 10)),
               "threshold_2" ~ as.data.frame(findpeaks(x = Score, minpeakheight = 6, sortstr = FALSE, minpeakdistance = 10)))
})

parameters(M) # list of parameters checks out
multiverse::expand(M) # analysis paths

# extracting the Peaks variable to see whether it worked
test <- M %>%
 extract_variables(Peaks)

test # only the first entry has a dataframe
test[1,]$Peaks
test[2,]$Peaks
test[3,]$Peaks

# outside of the multiverse, these functions do not produce NAs
as.data.frame(findpeaks(x = Score, sortstr = TRUE, minpeakdistance = 10)[1:2,])
as.data.frame(findpeaks(x = Score, minpeakheight = 3, sortstr = FALSE, minpeakdistance = 10))

运行后仅第一个分支(two_highest)生成有效数据框,其余两个分支返回NA,但在multiverse环境外运行相同findpeaks代码能正常得到结果,怀疑是multiverse变量访问方式有误,寻求解决方法。


解决方案

1. 修正分支表达式的语法格式

multiverse的branch函数要求每个分支的逻辑表达式需用大括号{}包裹,尤其是当表达式包含子集操作(如[1:2,])或多层函数调用时,未包裹的表达式会被解析器错误处理,导致返回NA。

修改后的核心代码部分:

inside(M, {
  Peaks <- branch(threshold,
                 "two_highest" ~ {as.data.frame(findpeaks(x = Score, sortstr = TRUE, minpeakdistance = 10)[1:2,])},
                 "threshold_1" ~ {as.data.frame(findpeaks(x = Score, minpeakheight = 3, sortstr = FALSE, minpeakdistance = 10))},
                 "threshold_2" ~ {as.data.frame(findpeaks(x = Score, minpeakheight = 6, sortstr = FALSE, minpeakdistance = 10))})
})

2. 确保执行所有分支

原代码仅调用了expand(M),但未显式执行所有分支逻辑,需添加execute(M)来触发每个分支的计算:

multiverse::expand(M)
multiverse::execute(M) # 新增:执行所有分支的分析逻辑

3. 正确提取与查看结果

使用extract_variables后,结果以列表列形式存储在数据框中,可通过索引或purrr工具批量查看:

# 查看所有分支结果
purrr::map(test$Peaks, print)

# 单独查看第二个分支
test$Peaks[[2]]

完整可运行代码

library(multiverse)
library(pracma)
library(dplyr)
library(purrr)

set.seed(1234)  
Score <- runif(100, min = 0, max = 10)

M = multiverse()

inside(M, {
  Peaks <- branch(threshold,
                 "two_highest" ~ {as.data.frame(findpeaks(x = Score, sortstr = TRUE, minpeakdistance = 10)[1:2,])},
                 "threshold_1" ~ {as.data.frame(findpeaks(x = Score, minpeakheight = 3, sortstr = FALSE, minpeakdistance = 10))},
                 "threshold_2" ~ {as.data.frame(findpeaks(x = Score, minpeakheight = 6, sortstr = FALSE, minpeakdistance = 10))})
})

# 展开并执行所有分支
multiverse::expand(M)
multiverse::execute(M)

# 提取结果
test <- M %>% extract_variables(Peaks)

# 打印所有分支的结果
purrr::walk(test$Peaks, ~print(.x, row.names = FALSE))

运行后三个分支都会返回有效数据框,与全局环境中运行的结果完全一致。


内容的提问来源于stack exchange,提问作者Leon164

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:47