鉴于有三个栅格,我需要从文本文件u
中提取与c
(行)= 5和smoke
(列)对应的值。
smoke <- matrix(c(5, 4, 2, 9, 2, 2), ncol=2, byrow=TRUE)
我使用的功能是:
library(raster)
r <- raster(nrows=10, ncols=10)
r <- setValues(r, 1:ncell(r))
func <- function(c, u, sit){
rasters <- mget(c('r', paste0('r', 1:2)))
x <- sapply(rasters, function(x) getValues(x, c)[u])
y <- sapply(rasters, function(x) getValues(x, u)[c])
g <- data.frame(y, x)
write.table(g, paste0("res_", sit, u, "_", c, ".txt"))
}
以下是我如何使用该函数提取与c
中的u
和smoke
对应的值:
res <- lapply(split(smoke[,c('c', 'u', 'sit')], 1:nrow(smoke)),
FUN=function(x) func(c=x[1], u=x[2], sit=x[3]))
我收到此错误:error: value for ‘r’ not found
答案 0 :(得分:1)
默认情况下,mget
仅在其被调用的环境中查找对象r
,r1
和r2
,但在您的情况下,这些对象是在全球环境中。您可以将inherits=TRUE
添加到mget
调用,这将强制它继续查看父环境,或者指定要使用envir=.GlobalEnv
查看的环境。
但是你还有其他一些问题。
首先,您的示例中不存在r1
和r2
。
其次,split
引起的列表是数据框列表,您需要在函数中对它们进行相应的索引。这意味着使用$
表示法(例如x$c
),双括号(例如x[[1]]
)或使用逗号(例如x[, 1]
)。
实现所有这些,你应该有:
func <- function(c, u, sit) {
rasters <- mget(c('r', paste0('r', 1:2)), envir=.GlobalEnv)
x <- sapply(rasters, function(x) getValues(x, c)[u])
y <- sapply(rasters, function(x) getValues(x, u)[c])
g <- data.frame(y, x)
write.table(g, paste0("res_", sit, u, "_", c, ".txt"))
}
library(raster)
res <- lapply(split(smoke[, c('c', 'u', 'sit')], 1:nrow(smoke)),
function(x) func(c=x[[1]], u=x[[2]], sit=x[[3]]))
最后,res
只是NULL
值的列表,因为您的函数返回write.table
的值,即NULL
。如果您希望func
返回g
,请在函数中添加最后一行,只读取g
(或明确地,return(g)
)。
我不确定您的小示例有多接近您的真实数据,但您可能更有效地处理此问题 - 请参阅?extract
,?cellFromRowCol
和?stack
,示例