#r #list #lapply
#r #Список #lapply
Вопрос:
Я хочу написать / применить функцию, которая повторяет LD2
функцию из pegas
пакета в наборе данных (jaguar), но каждый раз изменяет значение аргумента ‘locus’. Аргумент ‘locus’ принимает вектор длиной два (например, c(1,2), c (2,3), c(77,78) и т.д.).
Например, я хочу, чтобы код выполнялся loci.pairs[[1]]
, затем loci.pairs[[2]]
loci.pairs[[3]] и т.д. и выводил результаты в виде списка.
Я пытался сделать это с помощью lapply
циклов for и while, но столкнулся с ошибками (см. Ниже):
Загружайте библиотеки и данные
library(adegenet)
library(pegas)
data("jaguar")
Создайте список пар локусов
loci.pairs = combn(seq(1,ncol(jaguar)-1), 2, simplify = FALSE)
loci.pairs[[1]]
Сравните каждую пару местоположений из списка loci.pairs
LD2(jaguar, locus=c(1,2), details=FALSE)
LD2(jaguar, locus=loci.pairs[[1]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[2]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[3]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[4]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[78]], details=FALSE)
ошибка (lapply)
lapply(jaguar, function(x) LD2(jaguar, locus=loci.pairs[[x]], details=FALSE))
Ошибка в loci.pairs[[x]] : сбой рекурсивной индексации на уровне 2
Комментарии:
1. возможно, вы могли бы попробовать
sapply(1:number_of_pairs,function(x) LD2(jaguar,locus=loci.pairs[[x]],details=FALSE
Ответ №1:
lapply
функция имеет другой синтаксис. Попробуйте это:
lapply(loci.pairs, function(x) LD2(jaguar, locus=x, details=FALSE))
Первый аргумент lapply
содержит список, по которому вы хотите выполнить итерацию.
Поскольку вы хотите повторить комбинации, которые вы должны использовать lapply(loci.pairs...)
вместо lapply(jaguar,...)
.
По сути, этот вызов lapply
(с точки зрения вывода) эквивалентен следующему циклу:
result_list = list()
for (i in 1:n) {
result_list[[i]] <- LD2(jaguar, locus=loci.pairs[[i]], details=FALSE)
}