Неоднозначный вызов функции R

#r

#r

Вопрос:

Я работаю над проектом, пытаюсь преобразовать функцию R в CUDA C , но я не могу понять некоторые вызовы функций R, я действительно новичок в R и не могу найти то, что мне действительно нужно. Если быть точным, это основной код функции R.:

 for (i in 1:ncy) {
    res <- apply(allsubset, 2, banddepthforonecurve, xdata=x, ydata=y[,i], tau=tau, use=use)
    depth[i] <- sum(res[1,])
    localdepth[i] <- sum(res[2,])
  }
  

Часть, которую я действительно не могу понять, — это вызов функции «banddepthforonecurve», это код функции «banddepthforonecurve»:

 banddepthforonecurve <- function(x, xdata, ydata, tau, use) {
    envsup <- apply(xdata[,x], 1, max)
    envinf <- apply(xdata[,x], 1, min)
    inenvsup <- ydata <= envsup
    inenvinf <- ydata >= envinf
    depth <- all(inenvsup) amp; all(inenvinf)
    localdepth <- depth amp; use(envsup-envinf) <= tau
    res <- c(depth,localdepth)
    return(res)
  }
  

Когда она вызывается в:

 res <- apply(allsubset, 2, banddepthforonecurve, xdata=x, ydata=y[,i], tau=tau, use=use)
  

Я действительно не понимаю, что он установил для первого параметра «x» «banddepthforonecurve», я предположил, что это похоже banddepthforonecurve(i, xdata=x, ydata=y[,i], tau = tau, use=use)

но если я попытаюсь запустить его отдельно в R studio, чтобы попытаться лучше понять это, я получу:

 apply(xdata[, x], 1, max) : dim(X) must have a positive length
  

Почему, когда я компилирую весь проект R, этой ошибки нет? Что она устанавливает для параметра «x» при вызове в «res <- apply(…)»? Надеюсь, я выразился ясно, извините за мой плохой английский, заранее благодарю вас!

Ответ №1:

 # This apply function
res = apply(X = input, MAR = 2, FUN = foo, ...)

# is essentially syntactical sugar for this:
res = list()
for(i in 1:ncol(X)) {
    res[[i]] = foo(X[, i], ...)
}
# plus an attempt simplify `res` (e.g., to a matrix or vector)
  

Итак, в вашей строке:

 apply(allsubset, 2, banddepthforonecurve, xdata=x, ydata=y[,i], tau=tau, use=use)
  

На одной итерации вашего цикла for первым параметром banddepthforonecurve ( x ) будет allubset[, 1] , затем allsubset[, 2] , …, allsubset[, ncol(allsubset)] .

xdata Параметром всегда является x , параметрами tau and use всегда являются tau и use , и for цикл перебирает столбцы y для использования в качестве ydata аргумента. Вы можете представить это как вложенный цикл, для каждого столбца y используйте его как ydata и (через apply ) выполняйте итерации по всем столбцам allsubset .

(Если бы MAR аргументом apply был 1 , то итерация выполнялась бы по строкам вместо столбцов.)

Комментарии:

1. Большое вам спасибо! Это именно то, что я искал!