2016-07-26 13 views
0

у меня есть список имен и список таблицы, которые создают в ReporteRs пакетов, называемых «MyFTable», я попытался применить список из MyFTable со списком тlapply из списка в репортеры пакетов

t1 <- c("a","b","c") 
t2 <- c("d","e","f") 
t <- list(t1, t2) 

If I делаю отдельно, он работает, но когда я вхожу в цикл, он не работает.

addHeaderRow(MyFTable[[1]], value=c("", t1)) 
    addHeaderRow(MyFTable[[2]], value=c("", t2)) 

Это моя попытка:

for(i in 1: length(MyFTable)){ 
    lapply(MyFTable[[i]],function(x) addHeaderRow(x, value=c("",t[[i]]))) 
} 

for(i in 1: length(MyFTable)){ 
    lapply(MyFTable[[i]],function(x) addHeaderRow(x[[i]], value=c("",t[[i]]))) 
} 

я получил ошибку:

х должно быть FlexTable

Спасибо за ваши советы.

+0

Почему вы 'lapply'ing _in_ a' for'-loop? Используйте один или другой, и если вы собираетесь использовать 'for'-loops, prealocate. – alistaire

+0

Я попытался применить первый список df с первым списком имен – BIN

ответ

1

Вы добавили lapply не без оснований. Вы можете сделать это в регулярном цикле.

out <- vector("list", length(MyFTable)) # always pre-allocate 

for(i in 1:length(MyFTable)){ 
    out[[i]] <- addHeaderRow(MyFTable[[i]], value=c("",t[[i]]))) 
} 

Вы также можете использовать mapply, который работает на соответствующие элементы из всех предоставленных объектов (в данном случае mft и tt).

myFun <- function(mft, tt) addHeaderRow(mft, tt) 
mapply(FUN = myFun, mft = MyFTable, tt = t) 

Если вы одержимы lapply, можно «скрыть петлю».

lapply(1:length(MyFTable), FUN = function(i, mft, tt) { 
    addHeaderRow(mft[[i]], value = c("", tt[[i]])) 
}, mft = MyFTable, tt = t) 

Этот последний кусок кода интересен тем, что это легко показать, как отладка работает в R. Устанавливая browser() в какой-то момент в функции, выполнение остановится в этой точке, и вы можете осмотреть элементы или заранее набрав n или c. Первая команда переместит одну строку вперед (от browser() звонок), а c выполнит текущий «цикл» и ждет строку browser() в следующем цикле (если не закончена, то она существует).

Попробуйте, выполнить

lapply(1:length(MyFTable), FUN = function(i, mft, tt) { 
    browser() 
    addHeaderRow(mft[[i]], value = c("", tt[[i]])) 
}, mft = MyFTable, tt = t) 

и ваша подсказка должна немного изменить. Осмотреть элементы i, mft и tt и посмотреть, соответствуют ли они вашим MyFTable[[1]] и t[[1]] элементам. Чтобы выйти, введите Q.

+0

Итак, если у меня есть другая функция MyFTable [1,1: 10, newpar = TRUE, to = "header"] <- c ("", second [ [i]]) Как это работает для применения вашей функции() – BIN

+0

Я пытаюсь (i in 1: length (MyFTable)) {MyFTable [[i]] [1,1: 10, newpar = TRUE, to = "header "] <- c (" ", second [[i]])} работает – BIN

+0

@Stat В этот момент я попрошу вас задать новый вопрос и предоставить воспроизводимый пример. [Вот несколько советов] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) о том, как это сделать. –