在很多情况下,我需要编写一些构成逻辑集团的代码,并且将它放在函数中是正确的。但是,仅使用一次,会使代码远离应用程序的位置变得更加麻烦,并为其提供一次性名称,从而污染命名空间。
今天,我正在尝试,我也遇到了一个关于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)
问题:
提前多多感谢!
答案 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())
您不必跟踪分配,除非您使用全局分配,否则一切都是临时的。