如何在循环/应用命令中为spatstat对象分配标记?

时间:2013-11-20 13:53:27

标签: r spatial spatstat

某些spatstat函数(例如crossing.psp)不允许在函数内指定标记。我正在使用for循环和lapply命令创建一个复杂的函数,它调用ppppsp对象中的标记。我在使用get()函数时尝试将marks分配给这些对象时遇到问题。通常我会在这些情况下使用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对象指定标记或使用apply命令?

1 个答案:

答案 0 :(得分: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"

如果需要一对嵌套函数调用(内部函数调用marks<-()而外部函数调用assign())看起来很神秘,请查看"subset assignment" section of R-lang