【问题标题】:How to return list of multiple objects from a function in R?如何从R中的函数返回多个对象的列表?
【发布时间】: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 的 trainytestx 保存到 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 &lt;&lt;- list(c, list_i)) 而不是只返回列表?
  • @Dason 那是我尝试将函数的三个迭代中的每一个迭代的 trainy 和 testx 输出编译成一个全局列表,但显然它不起作用。

标签: r list function


【解决方案1】:

经过反复试验,我找到了一个简单的解决方案 - 如果有兴趣,我会在这里发布:

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 对象是一个 2x3 矩阵,包含 trainy 和 testx 输出。

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多