2013-11-20 3 views
1

Некоторые функции сплющивания, такие как crossing.psp, не позволяют назначать метки внутри функции. Я делаю сложную функцию для команд loop и lapply, которая вызывает отметки в ppp и psp объектах. Я испытываю проблемы при попытке назначить marks этим объектам, когда я использую функции 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 работы followingly:

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 объектов внутри циклов или используя применять команды?

ответ

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 ,

+0

Этот фрагмент кода содержит некоторые невероятно аккуратные трюки для меня (я никогда не думал о прямом размещении имени объекта в цикле, используя, например, 'i'). Благодаря! Думаю, мне удастся это выяснить, но как бы вы сделали то же самое с 'sapply' /' lapply'? – Mikko