-2

我正在做交叉验证。所以我想把数据分成10折。有人发布了以下代码。

f_K_fold <- function(Nobs,K=10){
    rs <- runif(Nobs)
    id <- seq(Nobs)[order(rs)]
    k <- as.integer(Nobs * seq(1, K-1) / K)
    k <- matrix(c(0, rep(k, each=2), Nobs), ncol = 2, byrow = TRUE)
    k[,1] <- k[,1]+1
    l <- lapply(seq.int(K), function(x, k, d)
        list(train=d[!(seq(d) %in% seq(k[x, 1],k[x, 2]))],
             test=d[seq(k[x,1],k[x,2])]),
        k=k,d=id)
    return(l)
}

但是我真的不明白在lapply做什么。有人可以向新手解释一下吗?欣赏它。

4

1 回答 1

3

不幸的是,这个例子中的代码折叠很糟糕,因为正确格式化的代码可以帮助理解代码和发现错误。

最后三行可以看作是传递给的匿名函数lapplylapply本质上“攀登”一个列表,并为每个列表元素应用该(匿名)函数。在下面的示例中,我将这些行消歧为一个不那么匿名的函数和对lapply.

  notSoanonymousFunction <- function(x, k, d) {
    list(train = d[!(seq(d) %in% seq(k[x,1],k[x,2]))],
         test = d[seq(k[x,1],k[x,2])])
  }
  l <- lapply(seq.int(K), FUN = notSoanonymousFunction, k = k, d = id)

如果您查看?lapply,您会注意到没有kd参数。但是,这些论点确实属于我们的notSoanonymousFunction,并lapply通过...论点接受它。

作为对您的一项心理锻炼,我将向您展示另一个技巧,如何了解该函数的作用。如果您需要查看函数内部发生了什么,browser()请在内部调用并运行它。在你的情况下,这看起来像这样:

  notSoanonymousFunction <- function(x, k, d) {
    browser()
    list(train = d[!(seq(d) %in% seq(k[x,1],k[x,2]))],
         test = d[seq(k[x,1],k[x,2])])
  }

一旦你运行它,你的控制台应该会说一些类似的东西

Browser[1] >

您现在有效地在函数内部。您可以通过键入来导航到下一行n,运行整个块c并一起退出浏览器,按Q(请参阅?browser())。您可以随意查看和操作对象。您可以尝试通过检查您的工作区ls()来查看函数内部的对象。你可以打赌你的家庭农场会有物品xk而且d

于 2013-06-19T05:41:40.813 回答