Цикл преобразования для применения при построении списка - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь построить список списков в R с помощью функции apply, а не цикла, но у меня возникают проблемы с преобразованием рабочего цикла в формат lapply.Позвольте мне объяснить ситуацию немного подробнее:

У меня есть функция в R (getDetails), которая извлекает детали, связанные с параметрами, которые я передаю функции, и возвращает результат в виде списка.Функция работает хорошо, если я передаю ей одну запись, и я также построил цикл, который позволяет мне циклически проходить по кадрам данных по одной строке за раз и передавать элементы данных, строка за строкой, моемуфункция, которая в свою очередь возвращает список в i-й элемент моего списка списков (detailsList[[i]]).Я пытаюсь выяснить, как преобразовать цикл for в функцию применения.Можете ли вы помочь мне с этим?Я создал игрушечный пример, который, если я смогу работать, позволит мне обобщить это для моей фактической getDetails функции.

#use cars dataset for an example
data(cars)
#get number of rows
numrows<-dim(cars)[1]
#initialize empty list
detailsList<-vector("list", numrows)

#This is a toy example of the loop I want to convert to an apply
#I'm having trouble because this builds up a list and returns the results
#to my detailsList one element at a time and I'm not sure how to do this 
#in an apply.
for (i in 1:numrows){
  detailsList[[i]]<-getDetails(cars[i,])
}

detailsList

getDetails<-function(parameters){
   valueA<-parameters[1]+45
   valueB<-parameters[1]+10
   list(valueA, valueB)
}

ОБНОВЛЕНИЕ:

Я думал, что только что понял это, но, кажется, когда я делаю это, я получаю третье измерение в своем списке, поэтому, когда я использую это:

allDetails <- lapply(1:numrows, function(i)  getDetails(cars[i,]))

, только второй элемент первого списка можетполучить доступ с allDetails[[1]][[1]][2] вместо allDetails[[1]][2], как я и надеялся.Кто-нибудь знает, что я здесь делаю не так?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вот ваш цикл, написанный с vapply

out <- vapply(1:nrow(cars), 
              function (i) {
                valA <- .subset2(cars, 1)[i] + 45L
                valB <- .subset2(cars, 1)[i] + 10L
                c(valA, valB)
              }, numeric(2))
t(out) 
#       [,1] [,2]
# [1,]   49   14
# [2,]   49   14
# [3,]   52   17
# [4,]   52   17
# [5,]   53   18
# [6,]   54   19
# [7,]   55   20
# ...
# (returns an array instead of a list, but that can be changed easily).

Кстати, я не знаю, какова ваша конечная цель, но в этом примере, почему any цикл вообще?

# vectorized
cbind(.subset2(cars, 1) + 45L, .subset2(cars, 1) + 10L)
#      [,1] [,2]
# [1,]   49   14
# [2,]   49   14
# [3,]   52   17
# [4,]   52   17
# [5,]   53   18
# [6,]   54   19
# [7,]   55   20
# ...
# or similar result with
# getDetails(cars) (version with c())
0 голосов
/ 15 января 2019

Я думаю, что я только что понял это после небольшой помощи от @Parfait (спасибо, @Parfait!). Если кто-то еще искал ответ, это сработало для меня, но я бы приветствовал любые другие ответы:

lapply(1:numrows, function(i)  getDetails(cars[i,]))

и мне пришлось изменить мою функцию, чтобы она возвращала вектор вместо списка:

getDetails<-function(parameters){
   valueA<-parameters[1]+45
   valueB<-parameters[1]+10
   c(valueA, valueB)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...