35

我有一个像这样的函数:

FUN <- function(x, parameter){
  if (parameter == 1){
      z <- DO SOMETHING WITH "x"}
  if (parameter ==2){
      z <- DO OTHER STUFF WITH "x"}
return(z)
}

现在,我想使用 apply 在数据集上使用该函数。问题是,那apply(data,1,FUN(parameter=1))

不会工作,因为 FUN 不知道“x”是什么。有没有办法告诉应用以“x”作为当前行/列来调用 FUN?`

4

3 回答 3

36

你想要apply(data,1,FUN,parameter=1)。注意...函数定义中的:

> args(apply)
function (X, MARGIN, FUN, ...) 
NULL

以及文档中的相应条目:

...:“FUN”的可选参数。

于 2011-01-21T15:55:53.000 回答
17

您可以在调用中创建一个匿名函数,apply以便 FUN 知道“x”是什么:

apply(data, 1, function(x) FUN(x, parameter = 1))

请参阅?apply底部使用此方法的示例。

于 2011-01-21T15:57:41.810 回答
3

...这是一个使用对象传递参数的实际示例,并且*apply. 它很光滑,这似乎是一个解释使用的简单示例。要记住的重要一点是,当您定义一个参数时,因为...对该函数的所有调用都必须具有命名参数。(所以 R 明白你想把什么放在哪里)。例如,我本可以调用times <- fperform(longfunction, 10, noise = 5000),但离开noise =会给我一个错误,因为它正在通过... 我的个人风格是命名所有参数,如果 a...只是为了安全而使用。

您可以看到参数noise是在调用中定义的,fperform(FUN = longfunction, ntimes = 10, noise = 5000)但没有被用于另外 2 个级别,diff <- rbind(c(x, runtime(FUN, ...)))最终调用fun <- FUN(...)

# Made this to take up time
longfunction <- function(noise = 2500, ...) {
  lapply(seq(noise), function(x) {
    z <- noise * runif(x)
  })
}

# Takes a function and clocks the runtime
runtime <- function(FUN, display = TRUE, ...) {
  before <- Sys.time()
  fun <- FUN(...)
  after <- Sys.time()
  if (isTRUE(display)) {
    print(after-before)
  }
  else {
    after-before
  }
}

# Vectorizes runtime() to allow for multiple tests
fperform <- function(FUN, ntimes = 10, ...) {   
  out <- sapply(seq(ntimes), function(x) {
    diff <- rbind(c(x, runtime(FUN, ...)))
  })
}

times <- fperform(FUN = longfunction, ntimes = 10, noise = 5000)

avgtime <- mean(times[2,])
print(paste("Average Time difference of ", avgtime, " secs", sep=""))
于 2012-10-08T19:05:49.890 回答