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

时间:2014-08-25 21:27:48

标签: 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

现在,让我们以相反的顺序进行相同的操作,即先分配一个非整数,然后重新分配一个整数。

# 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?

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

4 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:3)

  

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

没有。 int[1] = 1隐式地将int从整数强制转换为数字,因为您已为整数向量的元素指定了数值。

在下面的示例中,R不会隐式地将num从数字强制转换为整数,因为这可能会导致数据丢失......并且始终检查是否可以安全地将数字向量转换为整数是无效的。 / p>

num <- numeric(0)
num[1] <- 1L

答案 2 :(得分:2)

如果您希望is.integer返回您所期望的内容,则需要执行一些强制该数字(== 8字节类型)为整数模式(4字节类型)的操作。将整数值赋值给数字向量不会要求强制。如果将逻辑分配给空整数,则会发生同样的事情:

> int = integer(0)
>  int[1]
[1] NA
> int[1] <- FALSE
> int
[1] 0

答案 3 :(得分:1)

来自?is.integer

  

is.integer返回TRUEFALSE,具体取决于其参数是否为整数type,除非它是返回FALSE的因素。

通过测试,我们可以看到为什么 is.integer正在返回FALSE

> int <- integer(0)
> int[1] <- 1
> typeof(int)
# [1] "double"
> int[1] <- 1L
> typeof(int)
# [1] "double"