首页 > 解决方案 > 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)

标签: rfunctionloops

解决方案


这是一个矢量化的单线,可以选择允许您将下限从默认值 100 更改为您喜欢的任何值。如果边界错误,它会返回一个空向量而不是抛出错误。

它的工作原理是创建一个1:500(或更一般地说,1:n)的向量,然后测试每个元素是否大于 100(或您设置的任何下限m),以及每个元素是否为奇数以及每个元素是否可被 3 整除。它使用which函数返回通过所有测试的元素的索引。

Test <- function(n, m = 100) which(1:n > m & 1:n %% 2 != 0 & 1:n %% 3 == 0)

因此,您可以按照问题中的说明使用它:

Test(500)
# [1] 105 111 117 123 129 135 141 147 153 159 165 171 177 183 189 195 201 207 213 219
# [21] 225 231 237 243 249 255 261 267 273 279 285 291 297 303 309 315 321 327 333 339
# [41] 345 351 357 363 369 375 381 387 393 399 405 411 417 423 429 435 441 447 453 459
# [61] 465 471 477 483 489 495

或者玩弄上下界:

Test(100, 50)
# [1] 51 57 63 69 75 81 87 93 99

推荐阅读