2016-08-12 175 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. ' 「\'椅子\'」' –