Подзаголовок вне границ – общее определение и решение?
При работе с RI часто появляется сообщение об ошибке «индекс за пределами границ». Например :
# Load necessary libraries and data library(igraph) library(NetData) data(kracknets, package = "NetData") # Reduce dataset to nonzero edges krack_full_nonzero_edges 0 | friendship_tie > 0 | reports_to_tie > 0)) # convert to graph data farme krack_full <- graph.data.frame(krack_full_nonzero_edges) # Set vertex attributes for (i in V(krack_full)) { for (j in names(attributes)) { krack_full <- set.vertex.attribute(krack_full, j, index=i, attributes[i+1,j]) } } # Calculate reachability for each vertix reachability <- function(g, m) { reach_mat = matrix(nrow = vcount(g), ncol = vcount(g)) for (i in 1:vcount(g)) { reach_mat[i,] = 0 this_node_reach <- subcomponent(g, (i - 1), mode = m) for (j in 1:(length(this_node_reach))) { alter = this_node_reach[j] + 1 reach_mat[i, alter] = 1 } } return(reach_mat) } reach_full_in <- reachability(krack_full, 'in') reach_full_in
При этом возникает ошибка Error in reach_mat[i, alter] = 1 : subscript out of bounds
.
Однако мой вопрос заключается не в этом конкретном fragmentе кода (хотя было бы полезно также решить эту проблему), но мой вопрос более общий:
- Заглавийте первую букву обоих слов в строке из двух слов
- Как построить только легенды в ggplot2?
- Удаление html-тегов из строки в R
- обработка отрицательного числа в формате «учета»
- Как напрямую выбрать один и тот же столбец из всех вложенных списков в списке?
- Что такое определение ошибки подстрочного индекса? Что вызывает это?
- Существуют ли какие-либо общие способы приближения к такой ошибке?
- LDA с topicmodels, как я могу видеть, к каким темам относятся разные документы?
- Что означает «Следующий объект замаскирован из« package: xxx »?
- Множество групп ggplot
- Варианты кеширования / заметок / hashирования в R
- Автоматическая упаковка меток с помощью labeller = label_wrap в ggplot2
- Понимание дат и построение гистограммы с ggplot2 в R
- R + ggplot: отображение нескольких страниц
- Ошибка в R: (пакет, который доступен только в исходной форме и может потребоваться компиляция C / C ++ / Fortran)
Это связано с тем, что вы пытаетесь получить доступ к массиву из своей границы.
Я покажу вам, как вы можете отлаживать такие ошибки.
- Я устанавливаю
options(error=recover)
-
Я запускаю
reach_full_in <- reachability(krack_full, 'in')
Я получаю:reach_full_in <- reachability(krack_full, 'in') Error in reach_mat[i, alter] = 1 : subscript out of bounds Enter a frame number, or 0 to exit 1: reachability(krack_full, "in")
-
Я вхожу в 1, и я получаю
Called from: top level
-
Я
ls()
чтобы увидеть мои текущие переменные1] "*tmp*" "alter" "g" "i" "j" "m" "reach_mat" "this_node_reach"
Теперь я увижу размеры моих переменных:
Browse[1]> i [1] 1 Browse[1]> j [1] 21 Browse[1]> alter [1] 22 Browse[1]> dim(reach_mat) [1] 21 21
Вы видите, что альтер вне пределов. 22> 21. в линии :
reach_mat[i, alter] = 1
Чтобы избежать такой ошибки, лично я делаю это:
- Попробуйте использовать функцию
applyxx
. Они безопаснее, чемfor
- Я использую
seq_along
а не1:n
(1: 0) - Попытайтесь думать в векторизованном решении, если можете избежать доступа к
mat[i,j]
.
EDIT векторизовать решение
Например, здесь я вижу, что вы не используете тот факт, что set.vertex.attribute
векторизован.
Вы можете заменить:
# Set vertex attributes for (i in V(krack_full)) { for (j in names(attributes)) { krack_full <- set.vertex.attribute(krack_full, j, index=i, attributes[i+1,j]) } }
этим:
## set.vertex.attribute is vectorized! ## no need to loop over vertex! for (attr in names(attributes)) krack_full <<- set.vertex.attribute(krack_full, attr, value = attributes[,attr])
Это просто означает, что либо alter > ncol( reach_mat )
либо i > nrow( reach_mat )
, другими словами, ваши индексы превышают границы массива (i больше, чем количество строк, или alter больше, чем количество столбцов).
Просто запустите вышеуказанные тесты, чтобы узнать, что и когда происходит.
Иногда я сталкиваюсь с той же проблемой. Я могу ответить только на свою вторую пулю, потому что я не такой эксперт в R, как я с другими языками. Я обнаружил, что стандарт for
цикла имеет некоторые неожиданные результаты. Скажем, x = 0
for (i in 1:x) { print(i) }
Выход
[1] 1 [1] 0
В то время как с python, например
for i in range(x): print i
ничего не делает. Цикл не вводится.
Я ожидал, что если x = 0
то в R цикл не будет введен. Однако 1:0
– допустимый диапазон чисел. Я еще не нашел хорошего обходного пути, кроме того, что оператор if
завершает цикл for
Это произошло из бесплатного учебника stford standford, в котором говорится, что …
# Reachability can only be computed on one vertex at a time. To
# Reachability can only be computed on one vertex at a time. To
# get graph-wide statistics, change the value of "vertex"
# manually or write a for loop. (Remember that, unlike R objects,
# manually or write a for loop. (Remember that, unlike R objects,
# igraph objects are numbered from 0.)
ok, поэтому, когда вы когда-либо используете igraph, первый roll / column равен 0, кроме 1, но matrix начинается с 1, поэтому для любого вычисления под графиком вам понадобится x-1, показанный на
this_node_reach <- subcomponent(g, (i - 1), mode = m)
но для альтернативного расчета здесь есть опечатка
alter = this_node_reach[j] + 1
удалите +1, и он будет работать нормально
Только дополнение к приведенным выше ответам: возможность в таких случаях заключается в том, что вы вызываете объект, который по какой-то причине недоступен для вашего запроса. Например, вы можете подмножать имена строк или имена столбцов, и вы получите это сообщение об ошибке, когда ваша запрашиваемая строка или столбец больше не являются частью матрицы данных или данных. Решение. Как короткая версия вышеприведенных ответов: вам нужно найти имя последней рабочей строки или имя столбца, а следующий вызываемый объект должен быть тем, который не может быть найден. Если вы запускаете параллельные коды типа «foreach», вам необходимо преобразовать свой код в цикл for, чтобы иметь возможность устранить его.