user2078096 Asked: 2024-12-10 03:04:37 +0800 CST2024-12-10 03:04:37 +0800 CST 2024-12-10 03:04:37 +0800 CST R paste() 现在折叠为.hexmode() 零 772 我正在生成十六进制颜色代码。在 R3.6.2 中 paste(as.hexmode(c(213,94,0))) 生成 "d5" "5e" "00" 而在R4.4.1中它会生成 "d5" "5e" "0" 导致无效的十六进制代码("#d55e0")和损坏的代码 paste()现在似乎无法识别“hexmode”属性 - 相反,它将 as.hexmode() 的结果视为一个简单的整数。这种变化是可以预料的吗? 2 个回答 Voted Best Answer 2024-12-10T03:04:56+08:002024-12-10T03:04:56+08:00 是的,这是意料之中的。R 4.2 中的一项更改是: as.character(<obj>)"hexmode"或对象"octmode"现在满足重要的基本规则as.character(x)[j] === as.character(x[j]) 在 R 3.6 中,as.character.hexmode(x) 是以下的包装器 format.hexmode(x): x <- c(213, 94, 0) as.character(as.hexmode(x[3])) # 0 as.character(as.hexmode(x))[3] # 00 然而,在 R ≥ 4.2 中,它基本上等同于 sprintf("%x", as.integer(x)): as.character(as.hexmode(x[3])) # 0 as.character(as.hexmode(x))[3] # 0 这显然会给您和其他依赖零填充的人带来意想不到的后果。Martin Maechler(R 核心团队成员)的这条消息解释了其基本原理。无论如何,要获得所需的行为,您可以format.hexmode()直接使用: format(as.hexmode(x), width = 2) # [1] "d5" "5e" "00" 的行为format.hexmode()是自动将宽度填充为向量中任何值的最大位数,在本例中为两位,因此width = 2这里不需要。但是,最好使用width参数明确设置以覆盖所有情况。例如,如果您正在生成黑色的代码,则需要设置width以获得零填充输出: format(as.hexmode(c(0, 0, 0))) # [1] "0" "0" "0" format(as.hexmode(c(0, 0, 0)), width = 2) # [1] "00" "00" "00" 使用将在 R ≥ 4.2 和 <4.2 上format.hexmode()复制 R 3.6 的行为。paste() ThomasIsCoding 2024-12-10T03:55:26+08:002024-12-10T03:55:26+08:00 您得到的原因0已在SamR 的解决方案00中得到很好的回答。 这里只是一种解决方法。你可以使用as.character.numeric_version而不是as.character > as.character.numeric_version(as.hexmode(c(213, 94, 0))) [1] "d5" "5e" "00"
是的,这是意料之中的。R 4.2 中的一项更改是:
在 R 3.6 中,
as.character.hexmode(x)
是以下的包装器format.hexmode(x)
:然而,在 R ≥ 4.2 中,它基本上等同于
sprintf("%x", as.integer(x))
:这显然会给您和其他依赖零填充的人带来意想不到的后果。Martin Maechler(R 核心团队成员)的这条消息解释了其基本原理。无论如何,要获得所需的行为,您可以
format.hexmode()
直接使用:的行为
format.hexmode()
是自动将宽度填充为向量中任何值的最大位数,在本例中为两位,因此width = 2
这里不需要。但是,最好使用width
参数明确设置以覆盖所有情况。例如,如果您正在生成黑色的代码,则需要设置width
以获得零填充输出:使用将在 R ≥ 4.2 和 <4.2 上
format.hexmode()
复制 R 3.6 的行为。paste()
您得到的原因
0
已在SamR 的解决方案00
中得到很好的回答。这里只是一种解决方法。你可以使用
as.character.numeric_version
而不是as.character