→ locka: 原po想要做到的是這樣嗎? 02/05 02:14
→ locka: 我的想法是在funtion裡面多一步,加一個gsub利用正則表達式 02/05 02:16
→ locka: 尋找特殊字元並加入backslash(小牙籤) 02/05 02:16
→ andrew43: 如果是單、雙引號交錯使用呢? 02/05 15:09
→ Mensch5566: 先感謝各位耐心幫忙,我問題可能沒說清楚,我重新解釋 02/05 19:22
我先重新解釋一下
平常是會先在網頁上調SQL,大概像這樣:
https://imgur.com/ggBi82u
如上圖,紅箭頭是框欄位名的雙引號,藍箭頭是框值的單引號,兩者不能替換。
也就是說,R透過POST發送出去的字串,在加上小牙籤之前,要跟圖裡的長得一模一樣。
R要創建字串的時候,
雙引號可以括住單引號:
https://imgur.com/G6YWB1H
單引號可以括住雙引號:
https://imgur.com/iiX2q45
但是沒辦法同時框住單雙引號:
https://imgur.com/naoKVok
所以必須根據c()裡面最外層的引號,加入小牙籤。
如果最外層是雙引號,則字串裡的雙引號前必須加入小牙籤:
https://imgur.com/IkMNYcH
如果最外層是單引號,則字串裡的單引號前必須加入小牙籤:
https://imgur.com/UlEStXF
如此一來才能讓R識別,創建出字串。
話說回來,因為會先在網頁上寫SQL,確認語句正確後,
會把整條SQL複製並貼到POST的自訂函式裡面。
但這樣就會產生上面提到的,沒辦法同時框住單雙引號。
不管外層用單或雙引號,都沒辦法創建字串,因為裡面單雙引號都有。
https://imgur.com/DovVWtB
這時候唯一的辦法,就是根據最外層的引號,把字串中的引號前面加上小牙籤,
例如最外層是使用雙引號,則把裡面的雙引號都加上小牙籤,
像是這樣:
https://imgur.com/73qXquC
上圖中可以看到c函式有正確建立字串,就表示POST函式也沒有問題,
確實發送後也返回了200表示成功。
然而,現在的問題是,當網頁上複製過來的SQL語句很長的時候,
還得自己一個一個手動加上小牙籤,如果漏了就還得慢慢找。
因此想問,有沒有什麼辦法,可以在自訂函式這邊,
讓貼過來的SQL就直接能處理,即加上應有的小牙籤,並且POST出去。
目前找到最快的方法是使用r"()"
像這樣:
https://imgur.com/BGHLNL5
r"()" 用這前置字元確實可以說是完美了。
但偏偏r"()"現在Rstudio編輯器上面的判斷有點怪,
Rsutiod會將括號中的第一個雙引號當作結束,
所以在編輯器上面看會變成這樣,#後面都變註解:
https://imgur.com/zuIkyDp
雖然後半段被判斷為註解,但實際上R還是能識別。
但是真正寫的時候肯定會換行,所以整個腳本就會有一堆unexpected token,
雖然代碼還是能跑,但變得非常亂,像是這樣:
https://imgur.com/Xh9sWcT
所以想問問除了r"()",還有沒有更好的辦法。
跪謝惹Orz
※ 編輯: Mensch5566 (103.206.188.69 香港), 02/05/2021 19:23:49
→ locka: 所以是在雙引號前面加反斜線,那一樣可以用gsub做不是嗎? 02/05 20:41
→ Mensch5566: 不是的,問題不在自訂函數裡面。 02/05 21:23
請看這張下圖
https://imgur.com/f5Jfdn8
因為將#前的雙引號視為結束,#之後的都變成註解,
所以送到console之後,顯示加號,表示命令未完成。
自訂函式的外層換作單引號之後,則因字串中還有單引號,
所以導致字串識別錯誤。
https://imgur.com/gT6TXmu
問題是在自訂函數接收字串就已經產生,
所以不管自訂函式裡面是用gsub或什麼辦法,他都沒辦法繼續下一步處理。
※ 編輯: Mensch5566 (103.206.188.69 香港), 02/05/2021 21:30:08
推 andrew43: 可以和rstudio提報issue。編輯器應該可以再聰明一點才 02/06 00:41
→ andrew43: 是。 02/06 00:41
→ Mensch5566: 好的,準備回報去!感謝協助Orz 02/06 10:02
→ Mensch5566: 感謝提醒,一直糾結代碼,更新Rstudio,新版已解決 02/06 10:18