←
PDF 323 / 520 - Explicit coercion happens when you call a function like as.logi cal(), as.integer(), as.double
→
English · PDF 323
Original PDF page 323
中文 · PDF 323
  • 当你调用像 as.logi cal()、as.integer()、as.double() 或 as.character() 这样的函数时,就会发生显式强制转换。每当你发现自己在使用显式强制转换时,都应该检查是否可以在上游解决问题,从而让向量从一开始就不会是错误的类型。例如,你可能需要调整 readr 的 col_types 规范。
  • 当你在需要特定类型向量的特定上下文中使用某个向量时,就会发生隐式强制转换。例如,当你在数值汇总函数中使用逻辑向量时,或者在需要整数向量的地方使用双精度向量时。

由于显式强制转换相对较少使用,而且大多易于理解,所以我在这里将重点讨论隐式强制转换。

你已经见过最重要的隐式强制转换类型:在数值上下文中使用逻辑向量。在这种情况下,TRUE 会被转换为 1,FALSE 会被转换为 0。这意味着逻辑向量的和就是 TRUE 的个数,逻辑向量的均值就是 TRUE 的比例:

x <- sample(20, 100, replace = TRUE) y <- x > 10 sum(y) # 有多少个大于 10? #> [1] 44 mean(y) # 大于 10 的比例是多少? #> [1] 0.44

你可能会看到一些代码(通常是较旧的代码)依赖相反方向的隐式强制转换,即从整数到逻辑值:

if (length(x)) { # 做某些事情 }

在这种情况下,0 会被转换为 FALSE,其他所有值都会被转换为 TRUE。我认为这会让代码更难理解,所以我不推荐这样做。相反,应该明确地写:length(x) > 0。

同样重要的是要理解,当你尝试用 c() 创建包含多种类型的向量时会发生什么——最复杂的类型总是会胜出:

typeof(c(TRUE, 1L)) #> [1] "integer" typeof(c(1L, 1.5))