重新分配中is.integer()的行为

vit*_*tor 3 r

让我们创建一个整数向量,并为其第一个元素分配一个整数值,并将其重新赋值为非整数.

> int = integer(0)
> int[1]
> NA
> is.integer(int)
[1] TRUE

# assign int[1] to an integer
> int[1] = 1L
> is.integer(int)
[1] TRUE
# Now, re-assign to a non-integer
> int[1] = 1
> is.integer(int)
[1] FALSE # as expected
Run Code Online (Sandbox Code Playgroud)

现在,让我们做相同的但是以相反的顺序,即首先分配一个非整数,然后重新分配给一个整数.

# try again assigning to a non-integer first
> int = integer(0)
> int[1] = 1
> is.integer(int)
[1] FALSE
# Now, assigning to integer
> int[1] = 1L
> is.integer(int)
[1] FALSE # why?
Run Code Online (Sandbox Code Playgroud)

上次评估的类型是否取决于之前的分配?

jor*_*ran 7

我会说你看到的行为有点不同:

x <- 1:2
> storage.mode(x)
[1] "integer"
> x <- x + 0.5
> storage.mode(x)
[1] "double"
> x
[1] 1.5 2.5
> storage.mode(x) <- "integer"
> x
[1] 1 2
Run Code Online (Sandbox Code Playgroud)

通常,要求R将事物转换整数会冒失去信息的风险.因此,一旦赋值强制转换为double,除非您明确请求它,否则不会回头(这是一件好事).

您选择的具体示例依赖于只有一个值,但R实际上没有标量类型,因此所有内容都必须根据向量进行思考.这意味着许多R操作必须意识到事物对整个值向量的可能影响.