Как определить причину, Ошибка в: пропущенном значении, где требуется ИСТИНА / ЛОЖЬ, которая возникает только при запуске в качестве блестящего приложения - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над проектом карты и нанес на карту листовок два набора данных маркеров (блестящее приложение). Один набор данных больше другого, и я рисую большие круговые дуги, соединяющие множество с немногими. Все работало нормально. Я обновил R с 3,5 до 3,6, и теперь я получаю сообщение «Ошибка в случае, если: пропущено значение там, где требуется ИСТИНА / ЛОЖЬ», которое я выделил для оператора for, который запускает дуги большого круга.

Жесткое кодирование значений в gcIntermediate() работает, но тогда я могу иметь только 1 фиксированную дугу. Создание нового фрейма данных со значениями работает, но построенный из импортированных данных data.frame больше не работает.

# inside server.R
output$MapNet <-   renderLeaflet({
    leaflet() %>%
      addTiles(
        urlTemplate = "http://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga", 
        attribution = 'Google'
      ) %>%
      setView(lng = -93.85, lat = 37.45, zoom = 5)
  })  


NetData <- data.frame(PRgps.lon = c(-83.35300,-82.52681,-82.31592,-82.91263,-83.61500,-82.73041,-82.73041,-82.73041,-82.73041,-82.73041),
                      PRgps.lat = c(42.97400, 45.46538, 45.45996, 45.40823, 45.25417, 45.51366, 45.51366, 45.51366, 45.51366, 45.51366),
                      JCgps.lon = c(-82.68287,-81.63665,-81.96928,-81.96928,-81.96928,-82.92507,-81.96928,-82.61287,-81.06040,-81.63665),
                      JCgps.lat = c(45.68083, 45.66951, 45.58777, 45.58777, 45.58777, 45.24366, 45.58777, 45.68083, 44.65540, 45.66951),
                      popup = c("A", "P", "M", "M", "J  ", "M", "M", "M", "M", "M")
                      )    

arcbuilder(NetData, MapNet)

# Inside global.R
arcbuilder <- function(NetData, MapNet){
  for (i in 1:nrow(NetData)) {

    arc <- as.data.frame(gcIntermediate(c(NetData[i,]$PRgps.lon, NetData[i,]$PRgps.lat), 
                                        c(NetData[i,]$JCgps.lon, NetData[i,]$JCgps.lat), 
                                        n = 100, addStartEnd = TRUE ))

    MapNet <- MapNet %>% 
      addPolylines(lat = arc$lat,
                   lng = arc$lon,
                   color = "green",
                   weight = 2,
                   popup = NetData[i,]$popup)

  }
}

Приведенный выше код работает, данные, предоставленные NetData, являются главой (10)импортированных NetData. Аспекты num и chr - это то же самое, что и файл, если оставить их в этом поместье в одиночестве. Когда я не усердно ввожу его и подаю 100 строк данных в цикл for, я получаю предупреждение: Ошибка в: пропущенном значении, где требуется ИСТИНА / ЛОЖЬ. В частности, я получаю:

Warning: Error in if: missing value where TRUE/FALSE needed
  48: .interm
  47: gcIntermediate
  45: arcbuilder [C:\Users\me\Documents\GitHub\Network_Map/global.R#193]
  44: <observer> [C:\Users\me\Documents\GitHub\Network_Map/server.R#136]
   1: runApp

Где в строке # 136 вызывается arcbuilder () на сервере. R, а в строке 193 используется gcIntermediate () внутри arcbuilder () в global.R

Наконец, при запуске всего data.frame NetData в функцию arcbuilder с настройкой карты для работы вне блеска он запускается без ошибок. Я проверил данные от NA или других аномалий, и я достаточно уверен, что их нет.

Чего мне не хватает?

1 Ответ

0 голосов
/ 01 ноября 2019

Я не знаю, что изменилось между 3,5 и 3,6, но, играя с инструментами отладки, я обнаружил, что наблюдаемая ({}), содержащая вызов arcbuilder (), запускалась 3 раза до загрузки любых данных, чтопривести к отправке NA в gcIntermediate ().

решение на данный момент заключается в том, чтобы вставить цикл for в оператор if, чтобы убедиться, что данные загружены:

if (nrow(NetData) != 0) {
     for (i in 1:nrow(NetData)) {

Рад, что кто-топредложить более элегантное решение, но, по крайней мере, мой код снова работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...