Подтвердить что ты не робот

Передача аргументов итерационной функции посредством применения

У меня есть такая функция, как этот манекен:

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". Есть ли способ сказать применить для вызова FUN с "x" в качестве текущей строки /col? `

4b9b3361

Ответ 1

Вы хотите apply(data,1,FUN,parameter=1). Обратите внимание на ... в определении функции:

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

и соответствующую запись в документации:

...: необязательные аргументы в 'FUN.

Ответ 2

Вы можете сделать анонимную функцию в вызове apply, чтобы FUN узнал, что такое "x":

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

См. ?apply для примеров внизу, которые используют этот метод.

Ответ 3

Здесь приведен практический пример передачи аргументов с использованием объекта ... и *apply. Он скользкий, и это показалось легким примером для объяснения использования. Важно помнить, что когда вы определяете аргумент как ..., все вызовы этой функции должны иметь именованные аргументы. (так что R понимает, что вы пытаетесь поставить где). Например, я мог бы называть times <- fperform(longfunction, 10, noise = 5000), но оставить noise = дал бы мне ошибку, потому что она передается через .... Мой личный стиль - это имя всех аргументов, если используется ... безопасно.

Вы можете видеть, что аргумент 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=""))