Как я могу написать функцию, которая возвращает нечетные числа только из списка целых чисел, используя язык R?

Как я могу написать функцию, которая возвращает нечетные числа только из списка целых чисел, используя язык R? Пока я пробовал это

 function3 <- function(x){
      x<-as.integer(x)
      if (x %% 2 ==1) {
          return(x)
      }
    }

но это не работает для списков или векторов, и я действительно не знаю, как изменить свой код, так как «если» будет жаловаться на условие> «имеет длину> 1», и будет использоваться только первый элемент

function(x) x[ x %% 2 == 1 ]. Некоторые проблемы с вашим кодом: если x является вектором, тогда ваш if будет жаловаться на the condition has length > 1 and only the first element will be used, и, поскольку вы не вырезаете нечетные элементы, он возвращает входной аргумент. (Единственное изменение состоит в том, что я предполагаю, что вы хотите, чтобы он был целочисленным, хотя для этого вам действительно понадобилось бы x <- as.integer(x).)   —  person Lakhdar Mohamed Amine    schedule 09.03.2019

Большое спасибо, это была опечатка, и этим объясняется первое сообщение об ошибке. Теперь, когда мой код работает с одним целым числом; Я хотел бы использовать списки (векторы) и чтобы моя функция возвращала только нечетные элементы списка, но я действительно не знаю, как это сделать.   —  person Lakhdar Mohamed Amine    schedule 09.03.2019

В моем комментарии ответ состоит из первых 28 символов. Единственное, что вам нужно добавить, — это преобразовать в целые числа.   —  person Lakhdar Mohamed Amine    schedule 09.03.2019

По крайней мере, часть этого вопроса является дубликатом stackoverflow.com/q/23316161/3358272 и stackoverflow.com/q/14170778/3358272. Ваш первоначальный вопрос о том, как вернуть нечетные числа, был недостаточен, чтобы знать, что это был дубликат в первый раз.   —  person Lakhdar Mohamed Amine    schedule 09.03.2019

См. также:  Как узнать, присутствует ли файл в нескольких ветках в git
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Lakhdar Mohamed Amine
    justodd <- function(x) x[ x %% 2 == 1 ]
    justodd(4:20)
    # [1]  5  7  9 11 13 15 17 19
    

    Объяснение:

    • Индексирование описано в ?Extract (также в ?[) , вы увидите, что он принимает либо список integer (или целочисленный numeric), либо logical. В первом случае числа должны находиться в пределах длины вектора; если последнее, то он должен быть той же длины, что и исходный вектор. Например,

      x <- 4:20
      x[c(3,5,1)]
      # [1] 6 8 4
      x[c(F,F,T,F,T,F,F,F,T,F,F,F,F,F,F,F,F)]
      # [1]  6  8 12
      
    • так что наши [ внутренности выглядят как

      x %% 2 == 1
      #  [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
      # [13] FALSE  TRUE FALSE  TRUE FALSE
      
    • затем мы индексируем исходный вектор x на основе этого возвращаемого значения


    Обновить

    Ваше упоминание о том, что он не работает с list в качестве аргумента, предлагает альтернативу, которая работает медленнее, но работает как с векторами, так и со списками.

    justodd2 <- function(x) Filter(function(a) a %% 2 == 1, x)
    vec <- 4:20
    lst <- as.list(4:20)
    str(vec)
    #  int [1:17] 4 5 6 7 8 9 10 11 12 13 ...
    str(lst)
    # List of 17
    #  $ : int 4
    #  $ : int 5
    #  $ : int 6
    #  $ : int 7
    #  $ : int 8
    #  $ : int 9
    #  $ : int 10
    #  $ : int 11
    #  $ : int 12
    #  $ : int 13
    #  $ : int 14
    #  $ : int 15
    #  $ : int 16
    #  $ : int 17
    #  $ : int 18
    #  $ : int 19
    #  $ : int 20
    justodd2(vec)
    # [1]  5  7  9 11 13 15 17 19
    justodd2(lst)
    # [[1]]
    # [1] 5
    # [[2]]
    # [1] 7
    # [[3]]
    # [1] 9
    # [[4]]
    # [1] 11
    # [[5]]
    # [1] 13
    # [[6]]
    # [1] 15
    # [[7]]
    # [1] 17
    # [[8]]
    # [1] 19
    

    Сравнение производительности:

    microbenchmark::microbenchmark(
      a = justodd(vec),
      b = justodd2(vec),
      c = justodd2(lst)
    )
    # Unit: nanoseconds
    #  expr   min    lq  mean median    uq     max neval
    #     a   800  1000 26642   1100  1200 2537700   100
    #     b 12100 12500 24154  12700 13150 1055600   100
    #     c 12100 12300 23777  12500 12800 1022900   100
    

    (Не обращайте внимания на высокие значения mean и max из microbenchmark, они часто искажаются сборкой мусора во внутренних компонентах R. Если вы не знаете, что это такое … просто нажмите кнопку [I believe] или погуглите.)

    В конечном итоге, если вы всегда имеете дело с векторами, я предлагаю первое justodd решение, иначе justodd2 более безопасно (поскольку justodd(lst) не работает).

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: