R语言函数无法返回训练测试数据集问题求助
嘿,我来帮你搞定这个R语言的小问题!你的核心困扰其实有两个:函数调用后没返回值,以及对是否要传入df_n的疑惑,咱们一步步解决:
关键问题拆解
1. 为什么函数没有返回值?
在R里,函数默认会返回最后一行代码的执行结果,但你之前的函数最后一行是给df_test赋值,这行的返回值虽然是df_test,但如果不明确返回或者把结果赋值给变量,你就没法在外部拿到它。更重要的是,你需要返回两个数据集,这时候得用**列表(list)**把它们打包起来——R函数没法直接返回多个独立对象,但列表可以装下多个元素。
2. df_n必须传入函数!
你之前的函数依赖全局环境里的df_n,这其实很不规范,容易引发变量冲突,也让函数没法在其他场景复用。把df_n作为参数传入,函数才是独立、健壮的。
修正后的完整代码
# 定义函数,新增df参数传入归一化后的数据集 set_data <- function(n, df) { set.seed(n) # 设置随机种子保证可复现 train_percent <- 0.6667 sample_size <- floor(train_percent * nrow(df)) train_ind <- sample(seq_len(nrow(df)), size = sample_size) df_train <- df[train_ind, ] df_test <- df[-train_ind, ] # 把两个数据集打包成列表返回,给元素命名方便后续提取 return(list(train_set = df_train, test_set = df_test)) } # 调用示例(假设你已经有归一化好的df_n) # 第一次调用,种子为1 data_splits <- set_data(1, df_n) # 提取训练集和测试集到全局环境 df_train <- data_splits$train_set df_test <- data_splits$test_set # 重复调用5次的话,可以用lapply批量处理 # 生成种子1-5的拆分结果列表 all_splits <- lapply(1:5, function(seed) set_data(seed, df_n)) # 比如提取第3次拆分的测试集 third_test_set <- all_splits[[3]]$test_set
额外小提示
- 之前你尝试return单个数据集失败,大概率是因为没有把函数的返回值赋值给变量(比如你只写了
set_data(1)而不是result <- set_data(1))。 - 用列表返回后,你可以通过
$符号或者索引快速提取里面的数据集,非常灵活。
内容的提问来源于stack exchange,提问作者Kevin E Dow
相关产品推荐
相关产品推荐

