【问题标题】:Evaluating variable within R loop在 R 循环中评估变量
【发布时间】:2011-01-15 20:51:14
【问题描述】:

我正在尝试使用 For 循环迭代生成一些函数:

# Create a list to hold the functions
funcs <- list()
funcs[]

# loop through to define functions
for(i in 1:21){

    # Make function name
    funcName <- paste( 'func', i, sep = '' )

    # make function
    func = function(x){x * i}

    funcs[[funcName]] = func

    }

但是,它并没有像我希望的那样工作,因为 i 值没有在每个函数中进行评估。我想尝试将函数定义为等于 x * 1; x * 2;等等,但我最终得到的是一个函数 x * i;我是 21。

我尝试使用 eval() 函数,结果只是存储了 x * eval(i)。

【问题讨论】:

    标签: function r statistics for-loop


    【解决方案1】:

    使用闭包(编写函数的函数):

    multiply <- function(i) {
      force(i)
      function(x) x * i
    }
    
    funcs <- list()
    for(i in 1:21){
      funcName <- paste( 'func', i, sep = '' )
      funcs[[funcName]] = multiply(i)
    }
    
    # OR in one line, with lapply
    funcs <- lapply(1:21, multiply)
    

    【讨论】:

    • 我对闭包(一般意义上)的理解是,它是一个函数,在 时间它的定义。在 R 中,情况似乎并非如此,否则 celenius 的原始示例会起作用。 R 是否允许以某种方式创建“真正的”闭包,可能是通过显式指定环境或其他方式?
    • 对,所以每个函数中的每个“i”都绑定到循环索引中的“i”。它们被绑定到变量而不是值。这是您在任何函数式编程语言中都会得到的。
    • Hadley 的代码不起作用。 funcs$func3(3) 应该返回 9,但它返回 63,funcs 中的所有函数也是如此。
    • leif,你的解释不太正确——这是阻止我的代码工作的懒惰评估。通过在闭包范围内显式强制对 i 求值,代码现在可以工作了。
    • 哈德利,你是对的。在您的原始示例中,R 在循环结束之前不会乘以评估“i”,但“力”使其立即评估。如果您只关心一个变量,该文档看起来与使用“本地”语句的净效果相同。
    【解决方案2】:

    检查这个:

    # Create a list to hold the functions
    funcs <- list()
    funcs[]
    
    # loop through to define functions
    for(i in 1:21){
    
        # Make function name
        funcName <- paste( 'func', i, sep = '' )
    
        # make function
        func = paste('function(x){x * ', i,'}',sep = '')
    
        funcs[[funcName]] = eval(parse(text=func))
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-28
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2010-10-14
      • 2020-11-17
      相关资源
      最近更新 更多