【问题标题】:Not passing all optional arguments in apply未在 apply 中传递所有可选参数
【发布时间】:2015-04-13 20:23:19
【问题描述】:

我遇到了一些应用函数在不需要时将参数传递给函数的问题。我知道 apply 不知道如何处理可选参数,只是将它们传递给函数。

但无论如何,这就是我想做的:

首先我想指定一个我想使用的函数列表。

functions <- list(length, sum)

然后我想创建一个函数,将这些指定的函数应用于数据集。

myFunc <- function(data, functions) {
  for (i in 1:length(functions)) print(apply(X=data, MARGIN=2, FUN=functions[[i]]))
}

这很好用。

data <- cbind(rnorm(100), rnorm(100))
myFunc(data, functions)

[1] 100 100
[1] -0.5758939 -5.1311173

但我也想为某些函数使用额外的参数,例如

power <- function(x, p) x^p 

这不是我想要的。如果我将myFunc 修改为:

myFunc <- function(data, functions, ...) {
  for (i in 1:length(functions)) print(apply(X=data, MARGIN=2, FUN=functions[[i]], ...))
}

functions作为

functions <- list(length, sum, power)

然后尝试我得到的功能

myFunc(data, functions, p=2)

Error in FUN(newX[, i], ...) : 
  2 arguments passed to 'length' which requires 1

我该如何解决这个问题?

对不起,文字墙。谢谢!

【问题讨论】:

    标签: r function


    【解决方案1】:

    您可以使用functional 中的Curry 来修复您想要的参数,将函数放入您要应用的函数列表中,最后遍历这个函数列表:

    library(functional)
    
    power <- function(x, p) x^p 
    funcs = list(length, sum, Curry(power, p=2), Curry(power, p=3))
    lapply(funcs, function(f) apply(data, 2 , f))
    

    您可以使用您的代码:

    functions <- list(length, sum, Curry(power, p=2))
    myFunc(data, functions)
    

    【讨论】:

      【解决方案2】:

      我提倡使用上校的 Curry 方法,但如果您想坚持使用基本 R,您可以随时使用:

      funcs <- list(length, sum, function(x) power(x, 2))
      

      这大致就是Curry 的最终结果

      【讨论】:

        【解决方案3】:

        一种选择是在一个列表中传递参数,其中包含每个函数所需的参数。您可以使用c 将这些参数添加到apply 所需的其他参数,然后使用do.call 调用该函数。像这样的东西。我还将所有输出包装在一个列表中,而不是使用print;您的使用情况可能会有所不同。

        power <- function(x, p) x^p 
        myFunc <- function(data, functions, parameters) {
          lapply(seq_along(functions), function(i) {
              p0 <- list(X=data, MARGIN=2, FUN=functions[[i]])
              do.call(apply, c(p0, parameters[[i]]))
          })
        }
        
        d <- matrix(1:6, nrow=2)
        functions <- list(length, sum, power)
        parameters <- list(NULL, NULL, p=3)
        myFunc(d, functions, parameters)
        

        【讨论】:

          【解决方案4】:

          你可以使用lazyeval包:

          library(lazyeval)
          
          
          my_evaluate <- function(data, expressions, ...) {
            lapply(expressions, function(e) {
              apply(data, MARGIN=2, FUN=function(x) {
                lazy_eval(e, c(list(x=x), list(...))) 
              })
            })
          }
          

          并像这样使用它:

          my_expressions <- lazy_dots(sum = sum(x), sumpow = sum(x^p), length_k = length(x)*k )
          data <- cbind(rnorm(100), rnorm(100))
          my_evaluate(data, my_expressions, p = 2, k = 2)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-06
            • 1970-01-01
            相关资源
            最近更新 更多