Подзаголовок вне границ – общее определение и решение?

При работе с 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е кода (хотя было бы полезно также решить эту проблему), но мой вопрос более общий:

  • Что такое определение ошибки подстрочного индекса? Что вызывает это?
  • Существуют ли какие-либо общие способы приближения к такой ошибке?

Это связано с тем, что вы пытаетесь получить доступ к массиву из своей границы.

Я покажу вам, как вы можете отлаживать такие ошибки.

  1. Я устанавливаю options(error=recover)
  2. Я запускаю 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") 
  3. Я вхожу в 1, и я получаю

      Called from: top level 
  4. Я 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, чтобы иметь возможность устранить его.

  • Объединить строки по конкретным столбцам данных
  • Почему (или когда) Rscript (или littler) лучше, чем R CMD BATCH?
  • dplyr мутировать / заменять на подмножество строк
  • Графики Ганта с R
  • Воспроизведение решеточного диаграммы дендрограммы с ggplot2
  • Фиксирование порядка граней в ggplot
  • shiny 4 маленьких текстовых поля бок о бок
  • Как разбить фрейм данных?
  • Точное хранение больших целых чисел
  • Самый простой способ сгруппировать барплот
  • Удалите группы с менее чем тремя уникальными наблюдениями
  • Давайте будем гением компьютера.