2013-08-26 1 views
0

Моя цель заключается в создании списка индексных последовательностей, используя этот список исходных индексов следующим образом:генерации последовательностей, используя список «из» значений

values <- matrix (1:25, nrow=5) 
indexMatrix <- matrix (seq_along (values) , nrow=nrow(values)) 
fWidth <- 2 
startIndices<- list (
    vert=indexMatrix [1:(nrow (values)-fWidth) , 1:ncol (values)], 
    horiz=indexMatrix [1:nrow (values) , 1:(ncol (values)-fWidth)] , 
    upDiag=indexMatrix [fWidth:(nrow (values) - fWidth) , 1:(ncol (values) - fWidth) ] , 
    dnDiag=indexMatrix [1: (nrow (values) - fWidth) , 1: (ncol (values) - fWidth) ] 
) 

Я пытаюсь генерировать последовательности, используя эти подмножества в качестве отправных точек используя этот код, который, я надеюсь, перейду через главный список startIndices через каждый подсписчик, которые являются просто подмножествами исходной матрицы, генерируя последовательности * x, x + fun, x + 2 * fun, x + 3 * fun ... * (lapply), используя другое значение из списка funs для каждого под-списка (это часть for) и объединить их в один большой список (в этом примере 3-элементных) списков , Похоже, что моя проблема не передает правильный аргумент from в seq, однако я предполагал, что это будет векторизоваться над каждым подсписком, чтобы генерировать последовательность из каждого значения.

funs<-c(1 , nrow (values) , nrow (values) - 1 , nrow (values) + 1 
    ) 
    #browser() 
    seqs<- for (i in seq_along (startIndices)){ 
     unlist (
      lapply (startIndices [i] , 
      seq , by=funs[i] , to=fWidth*funs[i]) , #from=n from  indexMatrices[i] 
     FALSE , FALSE 
     ) 
    } 

Этот код приводит к сообщению об ошибке, Error in seq.default(X[[1L]], ...) : 'from' must be of length 1. У меня, похоже, есть фундаментальное непонимание того, как работает функция lapply. Я думал, что он будет использовать мой исходный набор данных в качестве списка аргументов для предоставленной функции, но, похоже, он не использует только элементы списка, а весь список. Это часть более крупной функции для вычисления произведения всех n смежные значения в матрице (n = width).

Мой желаемый результат может быть смоделирована следующим:

startIndices <- sapply (startIndices, as.vector) 
attach (startIndices) 
startIndices$vert <- matrix (c(vert, vert+1, vert+2), nrow=3, byrow=TRUE) 
startIndices$horiz <- matrix (c(horiz, horiz+5, horiz+10), nrow=3, byrow=TRUE) 
startIndices$upDiag <- matrix (c(upDiag, upDiag+4, upDiag+8), nrow=3, byrow=TRUE) 
startIndices$dnDiag <- matrix (c(dnDiag, dnDiag+6, dnDiag+12), nrow=3, byrow=TRUE) 

df <- lapply (startIndices, as.data.frame) 
unlist (lapply (df, as.list), FALSE, FALSE) 
+0

Пожалуйста, создайте воспроизводимый пример 'indexMatrix' и' fWidth' не определены здесь – mnel

+0

Eee! Сожалею. Я хотел просто включить часть кода, с которым у меня возникли проблемы, чтобы не поднимать более одного вопроса, но пренебрегали переопределением переменных, определенных в этой функции. Я добавил требуемые значения и в полный код для функции, над которой я работаю. Спасибо, что терпеливы со мной; Я очень надеялся, что не буду этим парнем. – mnosefish

+0

Поскольку вы никогда не говорите, что хотите, и полагайтесь вместо этого на ошибочный код, вы зависите от наших способностей, связанных с интуицией ошибок. Сейчас мой интуитив-фу слабый. Я предполагаю, что вы хотите использовать «mapply», поскольку, похоже, вы можете установить объект startIndices с 4 подстроками с равной длиной. Если вы действительно хотите обработать только один из списков startIndices за раз, тогда просто игнорируйте догадку и редактируйте свой вопрос, чтобы прояснить цели. –

ответ

0

Я не совсем понимаю, что вы пытаетесь сделать, но от быстрого взгляда кажется, что вы используете как lapply() и seq() неверно , Для seq() вам необходимо указать from, to и либо by, либо length. Что еще более важно, похоже, что код написан теперь, вы используете lapply() для одного элемента списка. Вы должны попробовать кормить весь список в качестве первого аргумента lapply() или, если вам нужно ссылаться на итератор внутри (i в вашем примере) рассмотреть возможность использования sapply() следующим образом:

sapply(length(startIndices),function(i) { 
     seq(from=?, to=fWidth*funs[i],by=funs[i]) 
}) 
+0

Аргумент from изначально предназначен для каждого элемента подсети, который в настоящее время обрабатывается циклом 'for'. Я думаю, что суть моего вопроса в том, как заставить 'seq' вести себя в векторном виде, чего явно не хочет делать. – mnosefish

Смежные вопросы