【发布时间】:2016-02-25 19:04:43
【问题描述】:
我想将多个训练和测试数据框的列表输入到一个函数中,在该函数中我操作数据、执行回归等,然后将结果作为对象或数据框列表输出。
这是一个带有玩具数据的简单编码示例:
# Create sample datasets
train1 <- data.frame(y=c(1,2,3),x=c(10,20,30))
train2 <- data.frame(y=c(2,3,4),x=c(15,25,35))
train3 <- data.frame(y=c(3,4,5),x=c(20,30,40))
test1 <- data.frame(y=c(2,3,4),x=c(15,25,35))
test2 <- data.frame(y=c(3,4,5),x=c(25,35,45))
test3 <- data.frame(y=c(4,5,6),x=c(35,45,55))
# Gather train & test datasets into list and initialize output_list
train_subset <- mget(paste0("train", 1:3), envir = .GlobalEnv)
test_subset <- mget(paste0("test", 1:3), envir = .GlobalEnv)
output_list <- setNames(lapply(1:3, function(i) list()), paste0('output_', 1:3))
f <- function(a,b,c)
{
a$log_y <- log(a$y)
trainy <- c(log(a$y))
testx <- data.matrix(b)
list_i <- list(trainy, testx)
return(output_list <<- list(c, list_i))
}
mapply(f, train_subset, test_subset, output_list, SIMPLIFY=F)
打印以下内容:
$train1
$train1[[1]]
list()
$train1[[2]]
$train1[[2]][[1]]
[1] 0.0000000 0.6931472 1.0986123
$train1[[2]][[2]]
y x
[1,] 2 15
[2,] 3 25
[3,] 4 35
$train2
$train2[[1]]
list()
$train2[[2]]
$train2[[2]][[1]]
[1] 0.6931472 1.0986123 1.3862944
$train2[[2]][[2]]
y x
[1,] 3 25
[2,] 4 35
[3,] 5 45
$train3
$train3[[1]]
list()
$train3[[2]]
$train3[[2]][[1]]
[1] 1.098612 1.386294 1.609438
$train3[[2]][[2]]
y x
[1,] 4 35
[2,] 5 45
[3,] 6 55
但是,只有 train3 和 test3 的 trainy 和 testx 保存到 output_list 对象中 - train1、test1、train2 和 test2 缺失:
> output_list
[[1]]
list()
[[2]]
[[2]][[1]]
[1] 1.098612 1.386294 1.609438
[[2]][[2]]
y x
[1,] 4 35
[2,] 5 45
[3,] 6 55
如何返回包含函数所有输出向量和矩阵的列表?
谢谢
【问题讨论】:
-
你为什么要做
return(output_list <<- list(c, list_i))而不是只返回列表? -
@Dason 那是我尝试将函数的三个迭代中的每一个迭代的 trainy 和 testx 输出编译成一个全局列表,但显然它不起作用。