Subscript out of bounds - general definition and solution?
This is because you try to access an array out of its boundary.
I will show you how you can debug such errors.
- I set
options(error=recover)
I run
reach_full_in <- reachability(krack_full, 'in')
I get :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")
I enter 1 and I get
Called from: top level
I type
ls()
to see my current variables1] "*tmp*" "alter" "g" "i" "j" "m" "reach_mat" "this_node_reach"
Now, I will see the dimensions of my variables :
Browse[1]> i
[1] 1
Browse[1]> j
[1] 21
Browse[1]> alter
[1] 22
Browse[1]> dim(reach_mat)
[1] 21 21
You see that alter is out of bounds. 22 > 21 . in the line :
reach_mat[i, alter] = 1
To avoid such error, personally I do this :
- Try to use
applyxx
function. They are safer thanfor
- I use
seq_along
and not1:n
(1:0) - Try to think in a vectorized solution if you can to avoid
mat[i,j]
index access.
EDIT vectorize the solution
For example, here I see that you don't use the fact that set.vertex.attribute
is vectorized.
You can replace:
# 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])
}
}
by this:
## 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])
It just means that either alter > ncol( reach_mat )
or i > nrow( reach_mat )
, in other words, your indices exceed the array boundary (i is greater than the number of rows, or alter is greater than the number of columns).
Just run the above tests to see what and when is happening.