Вывод алгоритма в R не сохраняется в переменной - PullRequest
0 голосов
/ 08 января 2019

Я использую пакет "Цезарь", который можно найти по адресу pdf . Как часть моего кода, мне нужно сохранить выходные данные алгоритма Цезаря в переменной, чтобы изменить его в двоичную форму. По некоторым причинам я не могу сохранить вывод в переменной. Я начал с typeof(), затем unlist. ничего не работает вот команда, используемая для шифрования:

caesar("15", direction = "left", distance = 2, reverse = FALSE)

где, "15" - это сообщение, которое должно быть зашифровано.

  • с использованием typeof(): typeof(caesar("15", direction = "left", distance = 2, reverse = FALSE)). возвращает: 37[1] "NULL"

  • с использованием unlist(): unlist(caesar("15", direction = "left", distance = 2, reverse = FALSE), use.names = FALSE). возвращает: 34NULL

Я даже пытался создать c ().

x<-c(caesar("15", direction = "left", distance = 2, reverse = FALSE))
>37
> x
>NULL

Есть идеи, что мне не хватает?

1 Ответ

0 голосов
/ 08 января 2019

вы не можете сохранить выходные данные функции цезаря, потому что сама функция не возвращает переменную. Глядя в код функции вы найдете

...        
cat(text)
...

Функция нигде не хранит переменную «текст», она просто печатает ее на экране. Если вы хотите сохранить его где-то, вы должны изменить тело функции, чтобы она могла возвращать переменную с именем text.

Попробуйте это:

caesar_new<-function (text, direction = "left", distance = 3, reverse = FALSE) 
{
if (!is.character(text)) {
stop("text must be a string!")
 }
if (!is.numeric(distance)) {
stop("distance must be a number!")
}
if (!distance %in% -46:46) {
stop("distance must be between -46 and 46")
} 
direction <- tolower(direction)
if (!direction %in% c("left", "right")) {
stop("direction must be 'left' or 'right'")
}
alphabet <- data.frame(original = letters, stringsAsFactors = FALSE)
special <- data.frame(original = c(0:9, " ", "!", ",", "@", 
                                 "&", "%", "-", "_", ":", ";", "?", "'"))
alphabet <- rbind(alphabet, special)
alphabet$cipher <- binhf::shift(alphabet$original, places = distance, 
                              dir = direction)
alphabet <- rbind(alphabet, data.frame(original = c("#", 
                                                  "\n"), cipher = c("#", "\n")))
if (!reverse) {
text <- tolower(text)
text <- gsub("[^[:alnum:][:space:]',!@&%-_:;]", "", 
             text)
text <- gsub("\\.", "", text)
text <- gsub(" +", " ", text)
for (i in 1:nchar(text)) {
  index_num <- which(substr(text, i, i) == alphabet$original)
  substr(text, i, i) <- alphabet$cipher[index_num]
}
}
else {
text <- gsub(" +", " ", text)
for (i in 1:nchar(text)) {
  index_num <- which(substr(text, i, i) == alphabet$cipher)
  substr(text, i, i) <- alphabet$original[index_num]
}
}
text <- gsub("\\\n", "\n#", text)
text <- gsub("#+", "#", text)
return(text)
}



x<-caesar_new("15", direction = "left", distance = 2, reverse = FALSE)


x
[1] "37"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...