R函数产生不正确的结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R函数产生不正确的结果相关的知识,希望对你有一定的参考价值。
我正在尝试使用R中的函数来做得更好,并且我正在研究一个函数,以将100到500的每个奇数取值,该值可以被3整除。我与下面的函数很接近。它会继续正确返回所有值,但在不应该包含序列号(101)的情况下,它还会包含第一个数字。任何帮助将不胜感激。我写的代码如下:
Test=function(n){
if(n>100){
s=seq(from=101,to=n,by=2)
p=c()
for(i in seq(from=101,to=n,by=2)){
if(any(s==i)){
p=c(p,i)
s=c(s[(s%%3)==0],i)
}}
return (p)}else{
stop
}}
Test(500)
答案
[这里是一个函数,它获得3的所有非偶数倍。它是完全矢量化的,根本没有循环。
- 检查
n
是否在[100, 500]
范围内。 - 创建从
N
到100
的整数矢量n
。 - 创建
N
的元素的逻辑索引,这些元素可以被3
整除,但不能被2
整形。 - 提取与索引
N
匹配的i
的元素。
主要工作在3个代码行中完成。
Test <- function(n){
stopifnot(n >= 100)
stopifnot(n <= 500)
N <- seq_len(n)[-(1:99)]
i <- ((N %% 3) == 0) & ((N %% 2) != 0)
N[i]
}
Test(500)
另一答案
这里是您目标的功能示例
Test <- function(n) {
if(n<100 | n> 500) stop("out of range")
v <- seq(101,500,by = 2)
na.omit(ifelse(v%%2==1 & v%%3==0,v,NA))
}
stop()
超出范围n
时将调用[>]- [
[100,500]
输出期望的奇数值+ifelse()
- [
NA
过滤出na.omit
并产生最终结果
另一答案
这里是单线,可以选择将下限从默认值100更改为所需的任何值。如果边界错误,它将返回一个空向量,而不是引发错误。
以上是关于R函数产生不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章
R 用 lubridate 在 DST 上添加月份会产生意想不到的结果