无法修改 psp 对象的子集

Cannot modify subset of psp object

全部,

我正在尝试修改 R 包 spatstat 中的 psp 对象的子集。这是给我一个问题的代码:

   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)

这向我发出警告:

Warning message: In a[a$marks$v1 == 2]$ends$x0 <- rep(5, 4) : number of items to replace is not a multiple of replacement length

修改psp对象的某些元素的正确方法是什么?我通常将此操作与数据框一起使用,没有问题。我的感觉是子集运算符 ([) 没有为此操作设置 psp class.

感谢您的阅读;感谢您提供的任何帮助。

这里的问题是您正试图写入 psp 对象的一个​​子集。尽管为此 class 定义了 [ 运算符,因此您可以 从中提取子集 ,但未定义 [<- 运算符,因此您可以't 覆盖一个子集

但是,您试图覆盖的成员是一个数据框,它当然定义了一个 [<- 运算符。所以你需要做的就是写入它而不对实际的 psp 对象进行子集化。

这是一个完整的代表:

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

reprex package (v0.3.0)

于 2020-08-18 创建

我将把它作为一个功能请求,为 [<- 添加一个方法 class psp

通常我们建议不要直接更改 spatstat 中对象的组件,因为这会破坏它们的内部一致性。所以 [<- 的方法将是最好的解决方案。