我尝试对不同于NA
的数组元素应用函数。我尝试对!is.na
函数使用if语句,但收到错误消息,提示"argument is of length zero"
。有人知道如何修复该错误,或者有其他方法仅选择矩阵的非NA
值吗?
F <- function(x, a, b, c, d) {
f <- a*(tanh(b*(x - c)) - d)
return(f)
}
nlon <- 3241 ; nlat <- 1680
p1 <- 3221 ; p2 <- 1103
pr_new <- matrix(0, nlat, nlon) # for the example
lim <- 10
for (n in 1:nlon) {
a <- -0.5; b <- 1; c <- 0; d <- 1 #Parameters of F
if (n < p1) { #left side of the step
for (m in nlat - lim:nlat) {
if (!is.na(c(pr_new[m, n]))) { #no calculation on the NA values
pr_new[m, n] <- F(n, a, b, c, d)
}
}
} else { #right side of the step
if (is.na(c(pr_new[p2, n]))) { #if we are on the upper step
for (m in p2 - 1:p2 - 1 - lim) {
if (!is.na(c(pr_new[m, n]))) { #no calculation on the NA values
pr_new[m, n] <- F(m, a, b, c, d)
}
}
} else { #if we are on the lower step
for (m in p2:p2 - lim) {
if (!is.na(c(pr_new[m, n]))) { #no calculation on the NA values
pr_new[m, n] <- F(m, a, b, c, d)
}
}
}
}
}
1条答案
按热度按时间d7v8vwbk1#
你可以通过在控制台输入循环索引名来找出错误发生后循环索引被设置为哪个值:
来自@zephryl的评论是正确的,但它只识别了三次发生类似错误中的一次。
在这些表达式中,由于“:“的运算符优先级高于二进制减号,因此使用冒号和minnus符号的表达式被错误地构造。您可以在
?Syntax
帮助页中找到运算符优先级规则。如果您更正了这三个错误,您将得到运行时没有错误的代码。
关于来自一个低代表的新用户的间接“答案”,我确实测试了它可能返回类似答案的理论。我确实在一些问题上尝试了chatGPT,并注意到它不仅返回了不正确的答案,而且在报告给它时也无法从错误中学习。当问题的标题和正文被提供给ChatGPT时,它给出了与现在删除的答案几乎相同的答案。
which
函数可用于从数组或矩阵返回索引向量,但在arr.ind
参数设置为非默认值的情况下使用该函数最为有用:..., arr.in = TRUE
。和na.omit
可用于从矩阵中删除大小写。但是,它将删除包含单个NA
的任何行的整行值。