#r #list #loops #lapply #sublist
#r #Список #циклы #lapply #подсписок
Вопрос:
Я пытаюсь использовать lapply в списке подсписков. Однако все, что я могу сделать, это перезаписать подсписки тем, что должно быть в них, вместо того, чтобы записывать в подсписки.
Чтобы сделать мою проблему понятной до скуки, это было бы то же самое, что иметь «Список магазинов» с «Магазином поделок» и «Магазином садоводства». Пытаюсь вписать «Молоток и гвозди» в подсписк «Сделай сам» и «Семена» в подсписк «Садоводство», но понимаю, что на самом деле вы нацарапали все свои товары в «Список покупок», уничтожив свои подсписки.
Я полагаю, что есть простой способ сказать R: «Эй, там, просто рекурсивно посмотрите на мой первый слой подсписков». В надежде, что это простое исправление и более широкий контекст не слишком полезен, мой раздел lapply и где, по моему мнению, следует внести изменения, находится чуть ниже.
# Create a list of Types and the matrices
StatMatrices <- lapply(Types, function(q) {
# Select Versus List so that for example, a HESH list only contains HESHVersusHEAT<
# HESHVerusHESH, HESHVersusAPDS and HESHVersusAPDR, and not HEATVersus.. and so on...
WhichVersus <- grep(paste0("(^", q, ")"), VersusList, value = T, perl = T)
EmptySublist <- (setNames(vector("list", length(Types)), WhichVersus))
})
names(StatMatrices) <- Types
Теперь я попробовал несколько вещей, таких как удвоение lapply
, но я даже не уверен, что делаю это правильно, не говоря уже о том, правильное ли это решение.
# Create a list of Types and the matrices
StatMatrices <- lapply(Types,
lapply, function(q) {
# Select Versus List so that for example, a HESH list only contains HESHVersusHEAT<
# HESHVerusHESH, HESHVersusAPDS and HESHVersusAPDR, and not HEATVersus.. and so on...
WhichVersus <- grep(paste0("(^", q, ")"), VersusList, value = T, perl = T)
EmptySublist <- (setNames(vector("list", length(Types)), WhichVersus))
})
names(StatMatrices) <- Types
Мой полный код показан ниже. Я пытался прокомментировать это, но, по сути, у меня есть 4 «Типа», и я создаю список с именем StatMatrices
. Это будет содержать дополнительные списки, следующий уровень будет состоять из имен, таких как, например VelStatMatrices
, имена в соответствии с последующей информацией, которая будет сохранена в них. Следующим набором списков будут так называемые Типы (т.е. HEAT
, HESH
, APDS
и APCR
). Они будут содержать матрицы сравнения, хотя на данный момент это только имена владельцев мест. Таким образом, внутри HESH
вас будет HESHVersusHEAT
HESHVerusHESH
HESHVersusAPDS
находиться и HESHVersusAPDR
ожидающая заполнения матрица.
Окончательный путь к списку будет выглядеть примерно так:
StatMatrices[["VelStatMatrices"]][[HESH]][[HESHVerusHEAT]]
и еще один подобный
StatMatrices[["PenStatMatrices"]][["APDS"]][["APDSVerusHESH"]]
Вот что у меня есть на данный момент:
#Mun Types
Types = c("HEAT", "HESH", "APDS", "APCR")
#Create empty vector for Versus name strings
VersusList <- c()
#Create Versus names e.g. HEATVerusAPDS and APCRVersusHESH etc
for (q in 1:length(Types)) {
for (j in 1:length(Types)) {
# VersusList(i) <- paste0(Types[q], "Versus", Types[j])
VersusList <- c(VersusList, paste0(Types[q], "Versus", Types[j]))
}
}
#Create List of lists of stat matrices, each to be filled with matrices,
StatMatrices <- list("PenStatMatrices", "DmgStatMatrices", "VelStatMatrices")
# Create a list of Types and the matrices
StatMatrices <- lapply(Types, function(q) {
# Select Versus List so that for example, a HESH list only contains HESHVersusHEAT<
# HESHVerusHESH, HESHVersusAPDS and HESHVersusAPDR, and not HEATVersus.. and so on...
WhichVersus <- grep(paste0("(^", q, ")"), VersusList, value = T, perl = T)
EmptySublist <- (setNames(vector("list", length(Types)), WhichVersus))
})
names(StatMatrices) <- Types
Я только начинаю использовать lapply и вряд ли знаю, что я делаю с R, поэтому буду признателен за любую помощь.
Комментарии:
1. Где
VersusList
(показано позже, но слишком много кода затрудняет поиск) ?! Не могли бы вы сделать свой пост более кратким?
Ответ №1:
Извините, что на данный момент не предоставил более конкретного ответа (возможно, поможет немного более краткий вопрос), но я бы рекомендовал посмотреть utils::modifyList()
. Похоже, это может помочь.
Кроме того, глядя на ваш вариант использования, вы можете сэкономить немного усилий, структурируя объекты немного по-другому, одним из примеров является матрица матриц:
Создайте матрицу 4×4 из матриц 4×4 (из случайных чисел для показа):
mtr <- matrix(
rep(list(matrix(runif(16L), nrow = 4L)), 16L),
nrow = 4,
ncol = 4
)
Задайте имена строк и столбцов для лучшей читаемости
rownames(mtr) <- colnames(mtr) <- c("HEAT", "HESH", "APDS", "APCR")
А затем получить доступ к данным следующим образом:
mtr["HEAT", "HEAT"]
что дает
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0.413062588 0.2497092 0.6465910 0.9492033
[2,] 0.007168949 0.9049881 0.1491240 0.1494439
[3,] 0.540454187 0.4837212 0.2674728 0.6261278
[4,] 0.327341522 0.9747880 0.7509647 0.5489474
И у вас есть список матриц, поэтому вы можете легко применять функции:
lapply(mtr, summary)
Возврат (усеченный):
[[1]]
V1 V2 V3 V4
Min. :0.007169 Min. :0.2497 Min. :0.1491 Min. :0.1494
1st Qu.:0.247298 1st Qu.:0.4252 1st Qu.:0.2379 1st Qu.:0.4491
Median :0.370202 Median :0.6944 Median :0.4570 Median :0.5875
Mean :0.322007 Mean :0.6533 Mean :0.4535 Mean :0.5684
3rd Qu.:0.444910 3rd Qu.:0.9224 3rd Qu.:0.6727 3rd Qu.:0.7069
Max. :0.540454 Max. :0.9748 Max. :0.7510 Max. :0.9492
[[2]]
V1 V2 V3 V4
Min. :0.007169 Min. :0.2497 Min. :0.1491 Min. :0.1494
1st Qu.:0.247298 1st Qu.:0.4252 1st Qu.:0.2379 1st Qu.:0.4491
...