написать функцию для подсчета количества гласных в строке - PullRequest
1 голос
/ 15 октября 2019

Мне был задан следующий домашний вопрос:

Напишите функцию, которая будет принимать строку в качестве входных данных и возвращать количество гласных в этой строке в качестве выходных данных

• Имяфункция get_vowel_count
• Обязательно документируйте, что функция делает, используя комментарии в R

Но когда я передаю функции заданную строку, она выдает 0 гласных в консоли, когда четкогласные в строке, которую я даю (например, «Джон Доу» содержит три гласных)

Я немного изменил выражение if, чтобы улучшить учет гласных, но я думаю, что программа будет считать только в том случае, если строкаэто точно "a", "e", "i" и т. д.

Я не уверен, какой синтаксис существует, чтобы сказать "содержит", а не "равен"


mystr <- "John Doe"

get_vowel_count <- function(phrase) {
  counter <- 0
  for (i in phrase) {
    if ((i == 'a') | (i == 'e') | (i == 'i') | (i == 'o') | (i == 'u')) {
      counter <- counter + 1 
    }   
  }
  output <- paste("Your phrase has", counter, "vowels in it!" )
  print(output)
}

get_vowel_count(mystr)

В выводе отображается 0 гласных, где ожидаемый должен сказать: «Ваша фраза содержит 3 гласных!»

Ответы [ 2 ]

1 голос
/ 15 октября 2019

for (i in phrase) не работает так, как вы думаете (в частности, он не работает так, как работает в Python). В R phrase рассматривается как 1-элементный вектор, содержащий одну символьную строку, а не (как в Python) упорядоченный набор букв.

Так что в первый раз через вашloop, i равен "John Doe", который не равен ни одной гласной. И ваш цикл повторяется только один раз.

  • Вы можете использовать strsplit(phrase,"")[[1]], чтобы разбить строку на вектор букв

  • Или вы можете использоватьчто-то вроде (for i in seq(nchar(phrase)) ... if (substr(phrase,i,i)==...)

  • Чтобы упростить проверку гласных звуков, вы можете использовать что-то вроде if (substr(phrase,i,i) %in% c("a","e","i","o","u")) ...

0 голосов
/ 15 октября 2019

В цикле for i просто передавал всю строку в оператор if, и цикл выполнялся только один раз. Теперь i передает по одному символу за раз и запускается для длины строки.

Хорошо сначала преобразовать строку в строчные, чтобы избежать конфликта регистра.

mystr <- "John Doe"
mystr_lower =tolower(mystr)

get_vowel_count <- function(phrase) {
  counter <- 0
  for (i in unlist(strsplit(phrase, ""))) {
    if ( i %in% c("a", "e", "i", "o", "u")) {
      counter <- counter + 1 
    }   
  }
  output <- paste("Your phrase has", counter, "vowels 
in it!" )
  print(output)
}

get_vowel_count(mystr_lower)

# Output: [1] "Your phrase has 3 vowels in it!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...