Вычисление расстояния с использованием ошибки широты и долготы [дубликат]

Если у вас есть значение, которое включает десятичное число, но десятичное значение пренебрежимо мало (то есть: 100.0) и попробуйте int, вы получите сообщение об ошибке. Это кажется глупым, но вызов float сначала исправляет это.

str (int (float ([variable])))

36
задан histelheim 22 February 2013 в 21:00
поделиться

5 ответов

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

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

  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

Вы видите, что 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])
60
ответ дан zx8754 16 August 2018 в 05:16
поделиться
  • 1
    Я думаю, вам нужно сначала options(error=function() dump.frames(to.file=TRUE)) , чтобы где-то появлялись журналы ошибок. – Léo Léopold Hertz 준영 9 November 2016 в 14:38
  • 2
    Очень полезно, эта отладочная вещь. В моем случае это позволило мне узнать, что «индекс за пределами границ» по-видимому, из-за ошибки, использующей коэффициент " вместо символа для доступа к столбцу матрицы по имени. as.character решил мою проблему. Странно то, что прослушиваемый код является частью библиотеки, которую я успешно использовал для подобных данных. – bli 30 November 2016 в 15:07
  • 3
    @bli, возможно, вы используете некоторые новые версии некоторых пакетов, которые больше не поддерживают фактор. – agstudy 30 November 2016 в 15:25

Только дополнение к приведенным выше ответам. В таких случаях возможно, что вы вызываете объект, который по какой-то причине недоступен для вашего запроса. Например, вы можете подмножать имена строк или имена столбцов, и вы получите это сообщение об ошибке, когда ваша запрашиваемая строка или столбец больше не являются частью матрицы данных или данных. Решение. Как короткая версия вышеприведенных ответов: вам нужно найти имя последней рабочей строки или имя столбца, а следующий вызываемый объект должен быть тем, который не может быть найден. Если вы запускаете параллельные коды типа «foreach», вам необходимо преобразовать свой код в цикл for, чтобы иметь возможность устранить его.

1
ответ дан Farshad 16 August 2018 в 05:16
поделиться

Я иногда сталкиваюсь с той же проблемой. Я могу ответить только на свою вторую пулю, потому что я не такой эксперт в 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

2
ответ дан James Pringle 16 August 2018 в 05:16
поделиться
  • 1
    Вот почему вы не делаете 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 больше, чем количество столбцов).

Просто запустите указанные выше тесты, чтобы узнать, что и когда происходит.

3
ответ дан January 16 August 2018 в 05:16
поделиться

Это произошло из бесплатного учебника 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, и он будет работать нормально

1
ответ дан YangJ 16 August 2018 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: