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

使用rsample+purrr::map2构建嵌套交叉验证时v参数传入报错

解决rsample嵌套交叉验证动态传v参数的问题

你遇到的这个报错是因为rsample的参数检查机制导致的:当你直接在nested_cv的outside参数里写vfold_cv(v = .y)时,R会立刻尝试解析这个调用,但此时.y还没有被map2迭代赋值,所以v参数不是一个有效的单整数,触发了vfold_cv的参数校验错误。

解决方案:延迟vfold_cv的调用时机

我们需要把外层交叉验证对象的创建逻辑延迟到map2的每个迭代步骤中,确保每次迭代时v参数都是明确的单整数值。这里有两种简洁的写法:

写法1:使用匿名函数

library(purrr)
library(parsnip)
library(rsample)
library(tidyr)
library(dplyr)

data("mtcars")
nested <- mtcars %>% 
  select(cyl, disp:gear) %>% 
  group_by(cyl) %>% 
  nest(data = disp:gear) %>% 
  mutate(n = 2:4) # 用mutate替代cbind,更贴合tidyverse风格

# 修改后的map2调用
nested %>% 
  group_by(cyl) %>% 
  mutate(cv = map2(data, n, function(.x, .y) {
    # 针对当前分组数据和v值,创建外层交叉验证对象
    outer_cv <- vfold_cv(.x, v = .y)
    # 传入nested_cv完成嵌套交叉验证创建
    nested_cv(.x, inside = vfold_cv(v = 10, repeats = 3), outside = outer_cv)
  }))

写法2:使用purrr的公式语法(更简洁)

nested %>% 
  group_by(cyl) %>% 
  mutate(cv = map2(data, n, ~nested_cv(
    .x,
    inside = vfold_cv(v = 10, repeats = 3),
    outside = vfold_cv(.x, v = .y)
  )))

原理说明

这两种写法的核心都是让vfold_cv在map2的每次迭代时才执行,此时.y已经被赋值为当前分组对应的v值(2、3、4),完全符合vfold_cv对v参数必须是单整数的要求,自然就能避开报错了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:52:34