使用 trunc() 函数时,没有返回正确的值

问题描述 投票:0回答:2
> a = pi
> a
[1] 3.141593
> trunc(a,3)
[1] 3

理想情况下,它应该是 trunc(a,3) 返回 3.141

为什么会这样?

r truncate
2个回答
2
投票

trunc
在 R 中总是返回一个 integer 值。如果要在该点后截去 3 位小数,可以乘以 10^3,应用
trunc
,然后再除以 10^3。在你的例子中

a <- pi
trunc(a * 1e3) / 1e3

如果你经常需要这个,你可以自己做一个功能。这是一个非常简单的示例,不会捕获错误:

# define the function
decimaltrunc <- function(x, digits = 0) trunc(x * 10^digits) / 10^digits
# then use it:
decimaltrunc(pi, 3)

快乐的 R 编程:-)


0
投票

默认的

trunc()
函数只有一个参数。此参数被截断,所有其他参数都被忽略。例如:

> trunc(2.2, 6.3, 4.4, "hi")
[1] 2

请注意,参数也可以是像

trunc(c(2.2, 6.3, 4.4))
这样的向量,在这种情况下,向量的所有元素都会被截断并返回一个向量,但它仍然只是一个参数。所以指定有效数字位数的功能没有实现,你需要乘以 10 的幂,就像 Ute 的答案一样。

当提供多个参数时函数不给出错误的原因,例如

ceiling(1.8, 2.6)
does 给出错误),是因为
trunc()
是用特殊参数
...
定义的允许在实现具有扩展功能的附加参数的自定义类时轻松扩展原始定义。来自 manual 关于舍入函数:

用法

天花板(x)
楼层(x)
截断(x,...)
 
圆(x,数字= 0)
signif(x, 数字 = 6)

争论

x
:一个数字向量。或者,对于
round
signif
,一个复杂的向量。
digits
:表示要使用的小数位数 (
round
) 或有效数字 (
signif
) 的整数。对于
round
,允许使用负值(参见“详细信息”)。
...
要传递给方法的参数。

这个的正常用例是首先对数据进行一些操作,使其适合原始功能,然后使用内置的

NextMethod()
调用。在此调用中,所有参数都提供给原始函数,因此需要忽略任何未使用的参数,如下例中的
printchar

MCVE:

myobject = 5.4321
class(myobject) <- "MyClass"
trunc.MyClass <- function(x, printchar = "*", ...) {
   paste0(printchar, NextMethod(), printchar)
}
trunc(myobject, printchar = "#")

结果:

[1] "#5#"

ceiling()
相比,它在原始定义中没有
...
参数:

myobject = 5.4321
class(myobject) <- "MyClass"

ceiling.MyClass <- function(x, printchar = "*", ...) {
   paste0(printchar, NextMethod(), printchar)
}
ceiling(myobject, printchar = "#")

在这种情况下,

NextMethod()
调用会导致错误:

Error in ceiling(myobject, printchar = "#") : 
  2 arguments passed to 'ceiling' which requires 1
© www.soinside.com 2019 - 2024. All rights reserved.