R中的算法输出未存储在变量中

时间:2019-01-08 00:53:23

标签: r

我正在使用pdf上的“凯撒”包。作为我的代码的一部分,我需要将Caesar算法的输出存储在一个变量中,以将其更改为二进制形式。由于某些原因,我无法将输出存储在变量中。我从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 :(得分:1)

您无法存储caesar函数的输出,因为该函数本身未返回变量。查看该函数的代码,您会发现

...        
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"

实际上,您实际上是在更改函数的主体,以便它可以存储您感兴趣的变量。如果愿意,还可以将其强制转换为其他数据类型。