Формулировка функции для передачи переменных в функцию отображения

У меня есть следующая функция, которая в первом примере работает нормально. Однако я хотел бы иметь две переменные, чтобы дополнительно иметь по два списка в функции сопоставления, чтобы обеспечить два результата в любой форме. переменная 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 - которая не включена ни в одну из частей согласно добавлению ее к вашему решению выше.


person Barnaby    schedule 31.08.2015    source источник


Ответы (1)


Неуверенность в проблеме, которую вы пытаетесь решить, все, что я могу сказать о результате приведенного ниже кода, заключается в том, что он выполняется и что ответ соответствует результату, полученному с вашей первой попытки.

Я создал функцию под названием mapply2, показанную ниже.

mapply2 <- function(i){
    w3 <- w2[[i]]
    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), 
          w3$wavelet, w3$nlevel, w3$schrinkfun, w3$threshfun, 
          w3$threshscale, MoreArgs=list(x=(xx[[i]])))
}

Обратите внимание, что я проиндексировал список xx той же переменной, что и остальная часть ввода, просто потому, что w2 и xx были списками одинаковой длины. (это приемлемо?)

Затем функция вызывается для каждого w2 и xx с помощью lapply,

result <- lapply(z, mapply2)

Также обратите внимание, что ввод функции (или его отсутствие) требует, чтобы mapply2 вызывалась из той же среды, которая содержит w2 и xx.

Изменить: не имея доступа к полному примеру, я могу только догадываться о том, как изменить свой ответ. Но я думаю, что что-то вроде

mapply2 <- function(xxi, w){

    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), 
       w$wavelet, w$nlevel, w$schrinkfun, w$threshfun, 
       w$threshscale, MoreArgs = list(x = xxi))
}

mapply3 <- function(i, w2, xx){
    xxi <- xx[[i]]
    w3  <- w2[[i]]
    z2  <- seq(1, length(xxi), 1)
    lapply(xxi, mapply2, w3)
}

Это называется следующим образом result <- lapply(z, mapply3, w2, xx). Для проверки возможности запуска кода я использовал следующую форму xx (я не знаю, похожа ли она по структуре на полную версию).

xx  <- list(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)),
        list(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),
             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)))
person frank2165    schedule 01.09.2015
comment
Спасибо за ответ, ваша петля делает то, что я хотел. В принципе, длина xx и w2 одинакова. По какой-то причине z не берется и выдает ошибку, поскольку он распознает его не как числовой и векторной, а как целочисленный числовой вектор data.frameRowLabels [1]. Даже когда я перешел на числовой с помощью as.numeric, ошибка продолжается. Возможно, это связано с вашим последним комментарием. Непонятно, что это означает в той же среде - person Barnaby; 01.09.2015
comment
Я рад, что цикл делает то, что вам нужно. Последний комментарий о средах был просто признанием своей лени, я не включил w2 в качестве входных данных для mapply2. Если код просто запускается как один скрипт, это, вероятно, не имеет значения. Боюсь, я не совсем понимаю остальную часть вашего комментария, вы описываете ошибку, которая возникает с mapply2 или с исходным кодом? - person frank2165; 01.09.2015
comment
Моя ошибка w2 в реальной вещи требует двух чисел для индексации MoreArgs = list (x = (xx [[i]] [[1]]))) - person Barnaby; 01.09.2015
comment
Как бы вы пошли, если бы последнее выражение MoreArgs = list (x = (xx [[i]] [[1]])) было - MoreArgs = list (x = (xx [[i]] [[j]]) )), что означает, что была бы введена новая переменная - j - в соответствии с добавлением ее к вашему решению выше. Я отредактировал вопрос, чтобы включить это также в вопрос. - person Barnaby; 15.09.2015
comment
@Barnaby Я обновил свой ответ, не могу сказать, что уверен, что код будет работать в полной версии, не увидев полную версию. - person frank2165; 15.09.2015
comment
Спасибо, однако в комментарии выше я сослался на другую переменную j, а не на i, поэтому на две разные вмененные переменные. Как w2 был j не я - person Barnaby; 22.09.2015