Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 未在apply中传递所有可选参数_R_Function - Fatal编程技术网

R 未在apply中传递所有可选参数

R 未在apply中传递所有可选参数,r,function,R,Function,apply函数在不需要时将参数传递给函数,我遇到了一些问题。我知道apply不知道如何处理可选参数,只是将它们传递给函数 但无论如何,我想做的是: 首先,我想指定一个要使用的函数列表 functions <- list(length, sum) 功能as functions <- list(length, sum, power) 我如何解决这个问题 对不起,这是文字墙。谢谢大家! 您可以使用Curryfromfunctional来修复所需的参数,将函数放入要应用的函数列表中,最后

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

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

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

functions <- list(length, sum)
功能
as

functions <- list(length, sum, power)
我如何解决这个问题


对不起,这是文字墙。谢谢大家!

您可以使用
Curry
from
functional
来修复所需的参数,将函数放入要应用的函数列表中,最后迭代此函数列表:

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))
库(功能性)

power一个选项是在一个列表中传递参数,其中包含每个函数所需的参数。您可以使用
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)

power您可以使用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(...))) 
    })
  })
}
库(lazyeval)

我的评价我主张使用上校的
咖喱
方法,但如果你想坚持R基,你可以:

funcs <- list(length, sum, function(x) power(x, 2))
funcs
myFunc(data, functions, p=2)

Error in FUN(newX[, i], ...) : 
  2 arguments passed to 'length' which requires 1
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)
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)
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)
funcs <- list(length, sum, function(x) power(x, 2))