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
相关产品推荐
相关产品推荐

