刚开始学习R,我立刻感到困惑:
鉴于每个人(在SO上)一直认为传值是主要的R范例之一,是否有可能有效地实现暗示"就地修改"的算法(又名快速排序等)?我看到它的方式 - 如果我使用RI执行此操作将必须返回中间结果有效复制在另一种语言中我将修改由指针/引用传递的数组.我错过了什么吗?
我明白这可能是错误的语言,但它真的如此吗?
主要有两种方法。如果您可以控制调用约定,则可以将对象包装在环境中。
pointer <- new.env()
pointer$data <- iris
fn1 <- function(env) {
numcols <- sapply(env$data, is.numeric)
env$data[, numcols] <- env$data[, numcols] + 1
}
fn1(pointer) # pointer$data will now contain iris with all the numeric columns
# incremented by 1. The full data set was never passed.
Run Code Online (Sandbox Code Playgroud)
如果你没有控制力,你可以尝试一些非标准评估的偷偷摸摸的东西,但要小心。
fn2 <- function(data) {
numcols <- sapply(data, is.numeric)
eval.parent(substitute(data[, numcols] <- data[, numcols] + 1))
}
fn2(iris) # iris will now contain iris with all the numeric columns
# incremented by 1. The full data set was also never passed.
Run Code Online (Sandbox Code Playgroud)
在 R 的 3.1 版中,写时复制将包括处理嵌套结构的能力,因此上述两个将等同于简单地
fn3 <- function(data) {
numcols <- sapply(data, is.numeric)
data[, numcols] <- data[, numcols] + 1
data
}
iris <- fn3(iris)
Run Code Online (Sandbox Code Playgroud)
如果您安装了 R 3.1,您可以通过使用microbenchmark这三个函数来自己验证性能声明。
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |