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