1

一些 spatstat 函数,例如crossing.psp不允许在函数内分配标记。我正在使用 for 循环和 lapply 命令制作一个复杂的函数,它需要标记ppppsp对象。我在使用函数时尝试为这些对象分配标记时遇到问题。get()通常我会assign在这些情况下使用函数,但不能让它工作。这是一个例子:

library(spatstat)

win <- owin(c(0,1), c(0,1))
p1 <- ppp(0.1, 0.3, window = win)
p2 <- ppp(0.2, 0.4, window = win)
p3 <- ppp(0.4, 0.7, window = win)

points <- c("p1", "p2", "p3")

对于那些不熟悉该软件包的人,marks工作如下:

marks(p1) <- "p1"

我想要做的是(或类似的东西,它给出了预期的结果):

for(i in length(points)){
marks(get(points[i])) <- points[i]}

当然,这不起作用,因为我正在使用赋值运算符进行get函数。如果我尝试assign功能,我会收到错误

for(i in 1:length(points)) assign(marks(get(points[i])), points[i]) 

#Error in assign(marks(get(points[i])), points[i]) : 
#  invalid first argument

# Or following also gives the same error:

for(i in 1:length(points)) assign(x = marks, value = points[i], envir =  get(points[i]))

我也试过:

setmarks(mget(points), points)
sapply(seq_along(points), function(i) marks(get(points[i])) <- points[i])

如何在循环内或使用应用命令为 spatspat 对象分配标记?

4

1 回答 1

1

这可以解决问题:

for(i in points) {
    assign(i, do.call(`marks<-`, list(x=as.symbol(i), value=i)))
}

## Check a point patter to see that it works
marks(p3)
# [1] "p3"

如果需要一对嵌套函数调用(内部一个 tomarks<-()和外部一个 to assign())看起来很神秘,请查看R-lang 的“子集赋值”部分

于 2013-11-20T14:20:41.363 回答