如何从R中的函数返回多个对象的列表?

时间:2016-02-25 19:04:44

标签: r list function

我想将多个训练和测试数据框的列表输入到我操作数据,执行回归等功能的函数中,然后将结果作为对象或数据框列表输出。

以下是玩具数据的简单编码示例:

# 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

但是,只有{3}和trainy用于train3和test3保存到testx对象中 - train1,test1,train2和test2丢失了:

output_list

如何从函数返回包含所有输出向量和矩阵的列表?

由于

1 个答案:

答案 0 :(得分:0)

经过一些试验和错误,我找到了一个简单的解决方案 - 如果有兴趣,我会在这里发帖:

f <- (function(a,b) 
    {
      trainy <- c(log(a$y))
      trainx <- data.matrix(a)
      testx <- data.matrix(b)
      list_i <<- list(trainy, testx)
    })

fit <- mapply(f,train_subset,test_subset)

其中对象fit是包含trainy和testx输出的2x3矩阵。