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
, иначе назначение в последней строке не будет сохранено.)