Не удается изменить подмножество объекта psp

#r #spatstat

#r #spatstat

Вопрос:

Все,

Я пытаюсь изменить подмножество объекта psp в пакете R spatstat. Вот код, который вызывает у меня проблему:

    set.seed(10)
   mat <- matrix(runif(40), ncol=4)
   mx <- data.frame(v1=sample(1:4,10,TRUE),
                    v2=factor(sample(letters[1:4],10,TRUE),levels=letters[1:4]))
   a <- as.psp(mat, window=owin(),marks=mx)
   #subset to marking v1 = 2, modify one of its endpoints
   a[a$marks$v1==2]$ends$x0<-rep(5,4)
  

это выдает мне предупреждение:

Предупреждающее сообщение: В [a $ отмечает $ v1 == 2] $ заканчивается $ x0 <- rep(5, 4) : количество элементов для замены не кратно длине замены

Каков правильный способ изменить некоторые элементы объекта psp? Я обычно использую эту операцию с фреймами данных и не сталкиваюсь с проблемой. Я чувствую, что оператор подмножества ([) не настроен для этой операции с классом psp.

Спасибо за чтение; ценю любую помощь, которая у вас может быть.

Комментарии:

1. Вы уверены, что a[a$marks$v1 == 2]$ends$x0 имеет длину 3?

2. спасибо за примечание — я не обновил предупреждающее сообщение обновлением set.seed для этого поста. Это все еще дает тот же результат

Ответ №1:

Проблема здесь в том, что вы пытаетесь выполнить запись в подмножество psp объекта. Хотя [ оператор определен для этого класса, чтобы вы могли извлечь из него подмножество, [<- оператор не определен, поэтому вы не можете перезаписать подмножество.

Однако элемент, который вы пытаетесь перезаписать, является фреймом данных, в котором, конечно, определен [<- оператор. Итак, все, что вам нужно сделать, это записать в это без подстановки фактического psp объекта.

Вот полный reprex:

 library(spatstat)

set.seed(10)
mat <- matrix(runif(40), ncol = 4)
mx  <- data.frame(v1 = sample(1:4, 10, TRUE),
                  v2 = factor(sample(letters[1:4], 10, TRUE),
                              levels = letters[1:4]))
a <- as.psp(mat, window = owin(), marks = mx)

#subset to marking v1 = 2, modify one of its endpoints
a$ends$x0[a$marks$v1 == 2] <- rep(5, 4)

a
#> marked planar line segment pattern: 10 line segments
#> Mark variables:  v1, v2
#> window: rectangle = [0, 1] x [0, 1] units
  

Создано 2020-08-18 пакетом reprex (версия 0.3.0)

Ответ №2:

Я приму это как запрос функции на добавление метода для [<- for class psp .

Как правило, мы не рекомендуем напрямую изменять компоненты объектов в spatstat , поскольку это может нарушить их внутреннюю согласованность. Таким образом, метод для [<- был бы лучшим решением.

Комментарии:

1. Я заглянул во внутренние компоненты psp объекта, чтобы убедиться, что эта конкретная операция не нарушила внутреннюю согласованность, и это казалось нормальным. Хотя я понимаю общую картину рекомендаций против такого рода вещей в целом. С точки зрения конечного пользователя, возможно, все, что нужно для [<- оператора, — это сообщение об ошибке, фактически говорящее «вы не можете этого сделать` — на данный момент сообщение об ошибке неясно.