У меня есть следующая функция, которая в первом примере работает нормально. Однако я хотел бы иметь две переменные, чтобы дополнительно иметь по два списка в функции сопоставления, чтобы обеспечить два результата в любой форме. переменная w2 - это список с двумя компонентами, а xx - это список с двумя векторами.
library(wmtsa)
# data feed to function
wavelet <- c("d2","s2","d4","s4","d6")
schrinkfun <- c("soft","hard")
threshfun <- c("universal", "adaptive")
threshscale <- c(0.05,0.1,0.15,0.2)
xx <- c(1,2,3,4,5,6,7,5,4,3,2,4,3,2,3,5,4,3,2,3,4,5,6,3,2,1,2,3,5,4,3,3)
nlevel<-seq(1: as.integer (floor (logb ((length(xx)),base=2))))
w2 <- expand.grid(wavelet=wavelet,nlevel=nlevel,schrinkfun=schrinkfun, threshfun= threshfun, threshscale= threshscale, stringsAsFactors=FALSE)
# Original function: To which I apply a unique list of values (w2) and a single vector for x. This function works fine.
result <- mapply(function(m,k,p,u,l,x) (wavShrink(x, wavelet= m, n.level =k, shrink.fun = p, thresh.fun =u, threshold=NULL, thresh.scale = l, xform="modwt", noise.variance=-1, reflect=TRUE)), w2$wavelet, w2$nlevel, w2$schrinkfun, w2$threshfun, w2$threshscale, MoreArgs=list(x=(xx)))
# Attempt to use (1) the index of w2 which is now a list of two (index z) - (2) the index of the list of xx which is a list of tow (index g). Again data feed with new levels and xx now formed each by a list of two elements.
wavelet <- c("d2","s2","d4","s4","d6")
schrinkfun <- c("soft","hard")
threshfun <- c("universal", "adaptive")
threshscale <- c(0.05,0.1,0.15,0.2)
xx <- list(c(1,2,3,4,5,6,7,5,4,3,2,4,3,2,3,5,4,3,2,3,4,5,6,3,2,1,2,3,5,4,3,3),c(0,3,1,4,1,2,7,5,4,1,3,4,9,2,7,5,1,3,2,2,4,7,6,4,2,1,1,1,5,1,3,1))
g <- seq(1:length(xx))
fun <- function (x) seq(1: as.integer (floor (logb ((length(xx[[x]])),base=2))))
nlevel <- lapply( g,fun)
fun <- function(x) expand.grid(wavelet=wavelet,nlevel=nlevel[[x]], schrinkfun=schrinkfun, threshfun= threshfun, threshscale= threshscale, stringsAsFactors=FALSE)
w2 <- lapply(g,fun)
z <- seq(1:length(w2))
# Attempt 1
result <- mapply(function(m,k,p,u,l,x) (wavShrink(x, wavelet= m, n.level =k, shrink.fun = p, thresh.fun =u, threshold=NULL, thresh.scale = l, xform="modwt", noise.variance=-1, reflect=TRUE)), w2[[z]]$wavelet, w2[[z]]$nlevel, w2[[z]]$schrinkfun, w2[[z]]$threshfun, w2[[z]]$threshscale, MoreArgs=list(x=(xx[[g]])))
Error in w2[[z]]$wavelet : $ operator is invalid for atomic vectors
# Attempt 2
result <- mapply ( function(z,g) ( mapply ( function(m,k,p,u,l,x) (wavShrink(x, wavelet= m, n.level =k, shrink.fun = p, thresh.fun =u, threshold=NULL, thresh.scale = l, xform="modwt", noise.variance=-1, reflect=TRUE)), w2[[z]]$wavelet, w2[[z]]$nlevel, w2[[z]]$schrinkfun, w2[[z]]$threshfun, w2[[z]]$threshscale, MoreArgs=list(x=(xx[[g]])))))
result
list()
Я, вероятно, неправильно использую второй mapply, поскольку он, похоже, не работает. Мне было интересно, можно ли это сформулировать как цикл для последнего сопоставления, в котором две переменные должны вводиться в функцию сопоставления, или, может быть, я мог бы использовать другое семейство приложений для этого. Результат должен быть таким же, как при применении правильного первого примера дважды в разделенных потоках данных с переменными, но объединенных в виде списка.
РЕДАКТИРОВАТЬ
После ответа от frank. Возникает вопрос, как бы вы переформулировали функцию ответа на выражение, если бы MoreArgs = list (x = (xx [[i]] [[1]])) было - MoreArgs = list (x = (xx [[i]] ] [[j]]))), что означает, что в функцию была бы введена новая переменная - j - которая не включена ни в одну из частей согласно добавлению ее к вашему решению выше.