在R中实现就地修改算法

时间:2014-05-27 16:10:49

标签: r algorithm

刚刚开始学习R而且我很困惑:

考虑到每个人(在SO上)如何继续说传值是主要的R范例之一,是否有可能有效地实现暗示“就地修改”的算法(又名快速排序等)?我看到它的方式 - 如果我使用R这样做,我将不得不返回中间结果有效地复制在另一种语言中我将只修改指针/引用传递的数组。我错过了什么吗?

我知道这可能是错误的语言,但实际上是这样吗?

1 个答案:

答案 0 :(得分:4)

主要有两种方法。如果您可以控制调用约定,则可以将对象包装在环境中。

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.

如果你没有控制权,你可以尝试使用非标准评估的东西,但要小心。

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.

在R的3.1版中,copy on write将包含处理嵌套结构的能力,因此上述两个就等同于

fn3 <- function(data) {
  numcols <- sapply(data, is.numeric)
  data[, numcols] <- data[, numcols] + 1
  data
}
iris <- fn3(iris)

如果您安装了R 3.1,则可以在这三个功能上使用microbenchmark来自行验证性能声明。