我正在使用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
知道我缺少什么吗?
答案 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"
实际上,您实际上是在更改函数的主体,以便它可以存储您感兴趣的变量。如果愿意,还可以将其强制转换为其他数据类型。