【问题标题】:R: deep copy a function argumentR:深拷贝函数参数
【发布时间】:2015-10-19 14:12:01
【问题描述】:

考虑下面的代码

i = 3
j = i
i = 4 # j != i

但是,我想要的是

i = 3
f <- function(x, j=i) 
    x * j
i = 4
f(4) # 16, but i want it to be 12

如果您想知道我为什么要这样做,您可以考虑这段代码 - 该应用程序是一个多次递减模型。转移矩阵的对角线是该行中其他减量的总和。我想定义我需要的减量,而不是使用这些减量计算其他函数。在这种情况下,我只需要 uxt01 和 uxt10,我想从中生成函数 uxt00 和 uxt11。我想要一些可以扩展到更高维度的东西。

Qxt <- matrix(c(uxt00=function(t=0,x=0) 0,
                uxt01=function(t=0,x=0) 0.05,
                uxt10=function(t=0,x=0) 0.07
                uxt11=function(t=0,x=0) 0), 2, 2, byrow=TRUE)

Qxt.diag <- function(Qxt) {
    ndecrements <- length(Qxt[1,])
    for(index in seq(1, N, N+1)) { # 1, 4
        Qxt[[index]] <- function(t=0, x=0, i=index, N=ndecrements) {
            row <- ceiling(index/ndecr)
            row.decrements <- seq( (row - 1)*N + 1, (row)*N) 
            other.decrements <- row.decrements[which(row.decrements != i]
            -sum(unlist(lapply(Qxt.fns[[other.decrements]], 
                function(f) f(t,x))))
        }
    }
    Qxt.fns
}

【问题讨论】:

  • 你能更全面地解释你为什么要这样做吗?
  • 这与深拷贝或浅拷贝无关。

标签: r arguments deep-copy


【解决方案1】:

这可以通过在创建函数后手动为形参j 分配默认表达式来完成:

i <- 3;
f <- function(x,j) x*j;
f;
## function(x,j) x*j
formals(f);
## $x
##
##
## $j
##
##
formals(f)$j <- i;
f;
## function (x, j = 3)
## x * j
formals(f);
## $x
##
##
## $j
## [1] 3
##
i <- 4;
f(4);
## [1] 12

这是可能的,因为 R 是一门很棒的语言,它为您提供了对函数的所有三个特殊属性的完整读/写访问权限,它们是:

  1. 构成正文的解析树:body()
  2. 形参及其默认值(它们本身就是解析树):formals()
  3. 封闭环境(用于实现闭包):environment()

【讨论】:

    【解决方案2】:

    如果要重用i,请将其分配给不同的变量:

    default_value = i
    f = function(x, j = default_value)
        x * j
    
    i = 4
    f(4) # 12
    

    当然,您不应该让这个变量随便乱放——这和原始代码一样糟糕。不过,您可以通过在本地环境中同时定义两者来使其对函数“私有”:

    f = local({
        default_value = i
        function(x, j = default_value)
            x * j
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多