对于R中的一次性功能,是否有更好的清洁方法?

时间:2016-01-05 21:20:57

标签: r lambda

在很多情况下,我需要编写一些构成逻辑集团的代码,并且将它放在函数中是正确的。但是,仅使用一次,会使代码远离应用程序的位置变得更加麻烦,并为其提供一次性名称,从而污染命名空间。

今天,我正在尝试,我也遇到了一个关于lambda expressions in R的问题。所以我实现了如下逻辑:

x <- (function(charsBase, n, m) {
  z <- apply(
    matrix(
        sample(unique(charsBase), n*m*3, replace = TRUE)
        , nrow = n*3, ncol = m
    )
    , 1
    , paste, collapse="")
  head(unique(z), n)
}) (LETTERS, 1000, 3)

问题:

  1. 有没有更好的方法在R中创建lambda?
  2. 虽然命名空间显然保持清洁,但内存怎么样?根据我的经验,当您在全局环境中创建/删除对象时,R通常会泄漏。如果在函数内进行了广泛的分配/释放,这是否会使内存受到控制?
  3. 提前多多感谢!

2 个答案:

答案 0 :(得分:3)

您可以将with与列表或数据框一起用作第一个参数。例如:

result <- with(list(a=3, b=4), {
    foo <- a + b
    foo^2
})

这样可以保持全局环境的清洁,因为括号中的部分是在评估发生后销毁的单独环境中进行评估的。

然而,根据我的经验,以这种方式编程会变得很麻烦。有时我发现在不再需要rm()时使用min[0] = array[0] min[i] = min(min[i-1], array[i] 0 < i < n 清除不需要的对象会更加实用。它不那么优雅,我同意。

答案 1 :(得分:0)

我会使用local更短的行和更易读的代码:

x <- local({
  charsBase <- LETTERS
  n <- 1000
  m <- 3
  sam <- sample(unique(charsBase), n*m*3, replace = TRUE)
  mtx <- matrix(sam, nrow = n*3, ncol = m)
  z <- apply(mtx, 1, paste, collapse="")
  head(unique(z), n)
})

除非您明确使用<<-全局作业,否则上述任何内容都不会“泄露”到全局环境中。在大括号内计算的最后一个“事物”的值变为x的值。你可以得到与...相同的结果。

local({
  charsBase <- LETTERS
  n <- 1000
  m <- 3
  sam <- sample(unique(charsBase), n*m*3, replace = TRUE)
  mtx <- matrix(sam, nrow = n*3, ncol = m)
  z <- apply(mtx, 1, paste, collapse="")
  x <<- head(unique(z), n)   # notice the wyrd assignment operator
})

...我会说它不那么优雅但是又一次,这是一个偏好的问题。

我在实验时有时会使用的一个有用技巧是......

local(browser())

您不必跟踪分配,除非您使用全局分配,否则一切都是临时的。