簡體   English   中英

sprintf無效格式'%d'

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM