Если внутри, наблюдать в блестящем - не дожидаясь спускового крючка - PullRequest
0 голосов
/ 26 марта 2020

В некоторой части моего кода у меня есть следующий объект наблюдения. Он работает нормально, пока я не добавлю в него статут if. Статус выполняется сразу же после запуска сценария и не ожидает запуска действия, связанного с наблюдением. Что мне нужно сделать, чтобы «держать лошадей» в этом, если внутри наблюдать? $ df ... если да, чем df2 = df2 и продолжайте вычисления.

Спасибо!

1 Ответ

1 голос
/ 26 марта 2020

ifelse векторизовано, а длина возвращаемого значения зависит от длины условия (первый аргумент). Я предполагаю, что ваши df2 и WP$df2 равны data.frame с, что означает, что, хотя длина, если is.null(df2) равна длине 1, "длина" WP$df не равна, она фактически равна ncol(WP$df). Это можно увидеть здесь:

length(mtcars)
# [1] 11
ncol(mtcars)
# [1] 11
nrow(mtcars)
# [1] 32

ifelse(TRUE, mtcars, iris)
# [[1]]
#  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4
# [19] 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

Это первый столбец (как list) mtcars. (Может быть полезно знать, что data.frame - это на самом деле просто list, где каждый элемент имеет одинаковую длину. Традиционно, каждый элемент представляет собой vector, но более сложные объекты («список-столбцы») также может иметься.)

Часто предполагается, что длины аргументов test=, yes= и no= для ifelse имеют одинаковую длину или длину 1 (что позволяет переработать). Но это ни проверено, ни приведено в исполнение:

ifelse(TRUE, 1:2, 11:13)
# [1] 1
ifelse(c(FALSE, TRUE), 1, 11:13)
# [1] 11  1ifelse(c(FALSE, TRUE, FALSE), 1, 11:12)
# [1] 11  1 11

Из этого можно сделать вывод, что объекты перерабатываются столько, сколько требуется для заполнения до длины test=.

Так что в вашем случае ваш ifelse(is.null(df), WP$df, df2) возвращает только первый столбец одного из двух.

Что-то еще в вашем коде: не используйте return.

Я предлагаю ваш код должен быть

observe({
    print("UPDATING COORDS")
    print(input$map_marker_dragend)
    id <- input$map_marker_dragend$id
    lat_nova <- input$map_marker_dragend$lat
    lon_nova <- input$map_marker_dragend$lng
    print(lat_nova)
    print(lon_nova)
    print(WP$df$latitude)
    if (is.null(df2)) df2 <- WP$df
    df2$latitude[which(WP$df$id == id)] <- lat_nova
    df2$longitude[which(WP$df$id == id)] <- lon_nova
    print(df2$latitude)
    print(df2, width = Inf)

    # declaring to later use
    WP$df2 = df2
  })

(я предполагаю, что WP от reactiveValues, иначе назначение в последней строке не будет сохранено.)

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