2013-11-20 20 views
1

某些spatstat函數(如crossing.psp)不允許在該函數內分配標記。我正在用for循環和lapply命令編寫一個複雜的函數,它要求在ppppsp對象中標記。當我使用get()函數嘗試將marks分配給這些對象時,我遇到問題。通常我會在這些情況下使用assign函數,但無法使其工作。這裏有一個例子:如何將標記分配給循環/應用命令中的spatstat對象?

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環路內的對象或使用應用的命令?

回答

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