如何在R中的字符串中存储特殊字符

如何在R中的字符串中存储特殊字符,r,string,special-characters,R,String,Special Characters,我试图将特殊转义字符\作为字符串的一部分存储在R中 x = "abcd\efg" # Error: '\e' is an unrecognized escape in character string starting ""abcd\e" x = "abcd\\efg" # Works 问题是,x实际上是我作为API web调用的一部分传递的密码,因此我需要找到一种方法,让字符串存储一个文本单斜杠,以使其正常工作 使用

我试图将特殊转义字符
\
作为字符串的一部分存储在R中

x = "abcd\efg"

# Error: '\e' is an unrecognized escape in character string starting ""abcd\e"

x = "abcd\\efg"

# Works
问题是,
x
实际上是我作为API web调用的一部分传递的密码,因此我需要找到一种方法,让字符串存储一个文本单斜杠,以使其正常工作

使用“忽略文字”命令的示例:

> x = r"(abcd\efg)"

> y = "https://url?password="

> paste(x, y, sep = "")
[1] "abcd\\efg123"

> # What I need is for it to return
[1] "abcd\efg123"

> z = paste(y, x, sep = "")

> z
[1] "https://url?password=abcd\\efg"

> cat(z)
https://url?password=abcd\efg

当我将
z
作为API命令的一部分传递时,会收到“坏凭证”消息,因为它将
\\
作为字符串的一部分发送
cat
将其正确返回控制台,但它似乎没有以打印回的方式发送该字符串。

与评论中的其他人一样,该字符串似乎由R正确处理。我认为它在其他地方会出现问题。API或密码匹配软件本身可能正在使用它

例如,如果逐字书写,反斜杠在大多数浏览器中不起作用,您需要使用
%5C
。这是一个关于它的讨论


因此,在您的情况下-尝试用其他符号替换反斜杠,如注释中提到的@Roland,或一些额外的反斜杠符号,如
\\\\\\\\\\
\\\\\
。然后看看它们是否有效。

答案和注释包含解决方案,但为了完整性,我会发布一个符合我具体情况的答案

我的包要求用户提供密码。如果密码中有
\
,则如上所述,命令将失败。解决方案似乎是在输入时处理它,而不是在用户提交密码后尝试更改值

library(RobinHood)

# If the true password is: abc\def

# The following inputs will all work
rh <- RobinHood("username", pwd = r"(abc\def)")
rh <- RobinHood("username", pwd = "abc\\def")
rh <- RobinHood("username", pwd = "abc%5Cdef")


库(RobinHood)
#如果真实密码为:abc\def
#以下输入将全部工作

右侧如果运行
x=“abcd\\efg”
cat(x)
您将看到此处只有一条斜线。
cat()
将不会转义“特殊”字符。并且
nchar(x)
返回8。在R代码中键入字符串文字值时,只需转义斜杠。它应该很好用,会好的。关键是,该字符串中只有一个真正的斜杠,尽管只有在
print()
读取值时,R才会转义特殊值。如果这在某个地方导致了问题,请显示实际给出错误的代码。仅使用
cat()
打印值,而不要将其与其他值组合。要连接字符串,请使用
paste()
。例如:
x3=粘贴(x2,y);cat(x3)
注意,从R4.0开始,您还可以使用忽略转义的“特殊”字符串
x4=r“(abcd\efg)”
如果这样做,您将看到
x2==x4
为真您看到打印到吊牌上的不是变量中的“真”值。如果要查看真实值,则需要cat()粘贴()ed值。print()函数以某种方式变换所有对象。即使是文字值,前面也会有[1]以显示其在向量中的部分。该字符串实际上不在向量中。你只是误解了输出。该变量包含您需要的值,在进行API调用时可以正常工作。