Если у вас есть значение, которое включает десятичное число, но десятичное значение пренебрежимо мало (то есть: 100.0) и попробуйте int, вы получите сообщение об ошибке. Это кажется глупым, но вызов float сначала исправляет это.
str (int (float ([variable])))
Это потому, что вы пытаетесь получить доступ к массиву из его границы.
Я покажу вам, как вы можете отлаживать такие ошибки.
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")
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
Вы видите, что alter вне пределов. 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])
Только дополнение к приведенным выше ответам. В таких случаях возможно, что вы вызываете объект, который по какой-то причине недоступен для вашего запроса. Например, вы можете подмножать имена строк или имена столбцов, и вы получите это сообщение об ошибке, когда ваша запрашиваемая строка или столбец больше не являются частью матрицы данных или данных. Решение. Как короткая версия вышеприведенных ответов: вам нужно найти имя последней рабочей строки или имя столбца, а следующий вызываемый объект должен быть тем, который не может быть найден. Если вы запускаете параллельные коды типа «foreach», вам необходимо преобразовать свой код в цикл for, чтобы иметь возможность устранить его.
Я иногда сталкиваюсь с той же проблемой. Я могу ответить только на свою вторую пулю, потому что я не такой эксперт в 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
for (i in 1:x)
для x, который может быть нулевым (он делает то, что он должен дать определениям, это просто не то, что вы надеялись сделать). Вы выполняете for (seq_len(x))
, чтобы получить поведение, которое вы ищете.
– Glen_b
22 February 2013 в 21:30
Это просто означает, что либо alter > ncol( reach_mat )
, либо i > nrow( reach_mat )
, другими словами, ваши индексы превышают границу массива (i больше числа строк или alter больше, чем количество столбцов).
Просто запустите указанные выше тесты, чтобы узнать, что и когда происходит.
Это произошло из бесплатного учебника stford standford, в котором говорится, что ...
# 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,
# igraph objects are numbered from 0.)
ok, поэтому, когда вы когда-либо используете igraph , первый roll / column равен 0, кроме 1, но матрица начинается с 1, поэтому для любого вычисления под графиком вам понадобится x-1, показанный на
this_node_reach <- subcomponent(g, (i - 1), mode = m)
, но для альтернативного вычисления здесь есть опечатка
alter = this_node_reach[j] + 1
удалить +1, и он будет работать нормально
options(error=function() dump.frames(to.file=TRUE))
, чтобы где-то появлялись журналы ошибок. – Léo Léopold Hertz 준영 9 November 2016 в 14:38as.character
решил мою проблему. Странно то, что прослушиваемый код является частью библиотеки, которую я успешно использовал для подобных данных. – bli 30 November 2016 в 15:07