2014-02-24 103 views
1

我需要以其他編程語言(其中編號不能超過14位數字)將som數據導出到文本文件。並非所有元素都需要用逗號分隔,所以這就是我使用這種方法的原因。R:用gsub替換科學記數法中的數字強制的字符串

問題在於gsub在強制轉換爲字符串時沒有重新調整數字42,科學計數選項scipen設置得足夠低,因此42會以電子表示法打印。

這裏scipen=-10 so 42用E-notation打印。

x <- 4.2e+1 # The meaning of life 
options(scipen = -10) 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=TRUE) 
[1] "4.2e+01" 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=FALSE) 
[1] "4.2e+01" 

這就像gsub不重新匹配。我也試過,

gsub(pattern=x,replacement=paste(",",x),as.character(x)) 

但沒有運氣。

在以下兩個示例中,gsub按預期行事,並且scipen=0足夠高以確保42被打印爲42

x <- 4.2e+1 # Still the meaning of life 
options(scipen = 0) 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=TRUE) 
[1] ", 42" 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=FALSE) 
[1] ", 42" 

正如你所看到的useBytes選項doens't沒有幫助。有人可以告訴我我沒有得到什麼。

謝謝。

回答

0

字符.+是預定義的正則表達式字符。因此,它們不是字面解釋。你必須逃避你的模式中的這些字符(與\\)。然後,它會工作。

x <- 4.2e+1 # The meaning of life 
options(scipen = -10) 

x_pat <- gsub("(\\+|\\.)", "\\\\\\1", x) 
# [1] "4\\.2e\\+01" 

gsub(x_pat, paste(",", x), x) 
# [1] ", 4.2e+01" 

另一種可能性是使用參數fixed = TRUE。這與原樣匹配模式字符串。

gsub(x, paste(",", x), x, fixed = TRUE) 
# [1] ", 4.2e+01" 
相關問題