[英]sprintf invalid format '%d'
這有效:
> sprintf('%d', c(1, 1.5))
[1] "1" "1"
這不是:
> sprintf('%d', c(1.5, 1))
Error in sprintf("%d", c(1.5, 1)) :
invalid format '%d'; use format %f, %e, %g or %a for numeric objects
為什么?
這實際上是非常有趣的問題。 首先, %d
代表整數。 如果可能,vector參數將被回收,但如果它是c(1.5, 1)
,當sprintf()
嘗試用1.5替換%d
(這不是整數)時,它將失敗。
我認為這可能與以下事實有關:在R中,integer和double都是數字模式,例如:
storage.mode(c(1.5, 1))
# [1] "double"
storage.mode(c(1, 1.5))
# [1] "double"
mode(c(1,1.5))
# [1] "numeric"
mode(c(1.5,1))
# [1] "numeric"
因此,兩個向量應存儲為double。 有關R語言定義和文檔中的向量的更多信息? numeric
? numeric
:
潛在的混淆是R使用“數字”模式來表示“雙重或整數”
我可能已經在底層的C代碼中找到了解釋發生了什么的行:
if(TYPEOF(_this) == REALSXP) {
double r = REAL(_this)[0];
if((double)((int) r) == r)
_this = coerceVector(_this, INTSXP);
此代碼執行以下操作:如果向量類型為REALSXP
(表示數字),則將向量的第一個成員轉換為double r
。 然后將r
為整數然后加倍,如果字節仍然相同, INTSXP
整個向量轉換為INTSXP
。 重要的是,此代碼僅檢查向量的第一個元素; 如果該元素可以強制轉換為整數,則強制轉換整個向量,否則代碼會產生錯誤。
為了測試這個假設,可以使用自定義sprintf()
編譯R,其中double r = REAL(_this)[0];
改為double r = REAL(_this)[1];
並測試c(1.5, 1)
是否現在有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.