2016-08-12 177 views
-1

我有一个包含反引号的字符串,这会搞乱连接函数。如果你尝试用反引号来连接,将串连功能不喜欢这样的:连接一个包含反引号字符的字符串R

a <- c(`table`, `chair`, `desk`) 
Error: object 'chair' not found 

这样我就可以创建变量:

bad.string <- "`table`, `chair`, `desk`" 
a <- gsub("`", "", bad.string) 

,给出了一个字符串"table, chair, desk".

然后它应该是这样的:

good.object <- c("table", "chair", "couch", "lamp", "stool") 

我不知道为什么反引号导致连续nate函数中断,但是如何替换字符串以使其不具有非法字符?

+2

请用'dput(object)'显示您的实际向量;显然它不是'c(\'table \',\'chair \',\'desk \')',因为这会产生一个错误。 – nrussell

+1

如果你有一个包含反引号的字符串,你是如何阅读它的?该对象是否被创建。 – akrun

+0

它实际上是一个从MySql粘贴的对象,它是100个项目,形式为'a','b','c',...理想情况下,我会有一个SQL查询来选择所有表名,但现在我有将表名粘贴到一个字符串中,并将反引号插入。我必须为很多表执行此操作,所以我不想手动查找/替换反引号。 – jrzelling

回答

2

尝试:

good.string <- trimws(unlist(strsplit(gsub("`", "", bad.string), ","))) 

这里gsub()用于去除反引号,strsplit一个字符串转换成字符串的列表,其中,在原始字符串的逗号表示分离,unlist()转换字符串列表成字符串的向量,并且trimws()删除尾随或空白空格。

1

从上quotes文件,反引号被保留用于非标准的名字如

`the dog` <- 1:5 
`the dog` 
# [1] 1 2 3 4 5 

所以,当你试图使用连击,R是没有做错什么。它会查看c()中的所有变量并尝试查找它们,从而导致错误。

如果这是一个你写的向量,只需用单引号或双引号替换所有反引号即可。

如果以某种方式被R中产生,把整个事情作为一个字符串,然后使用gsub()eval(parse())

eval(parse(text = gsub('\`',"\'","c(`table`, `chair`, `desk`)"))) 
[1] "table" "chair" "desk" 

编辑:对于bad.string

新的例子你必须去通过用双引号替换所有后面的刻度,然后您可以通过read.csv()来读取它。这虽然有点不合理,但是它会给出一个行向量,所以我们转置它以获得一个列向量

bad_string <- "`table`, `chair`, `desk`" 
okay_string <- gsub('\`','\"',bad.string) 

okay_string 
# [1] "\"table\", \"chair\", \"desk\"" 
t(read.csv(text = okay_string,header=FALSE, strip.white = TRUE)) 
#  [,1] 
# V1 "table" 
# V2 "chair" 
# V3 "desk" 
+0

另请注意,该字符串不包含反引号,因为您从未实际创建过一个字符串。像“椅子”这样的东西将是一个包含反引号的字符串,不会引起任何问题。 – Dason

+0

@dason是的,这是正确的,你可以有反引号,但它也是犹太教逃避他们s.t. ' “\'椅子\'”' –