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

sf6xfgos  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(120)
> a = pi
> a
[1] 3.141593
> trunc(a,3)
[1] 3

理想情况下,它应该是trunc(a,3),返回3.141
为什么会这样?

htrmnn0y

htrmnn0y1#

R中的trunc总是返回一个 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)

happy R programming:-)

cwxwcias

cwxwcias2#

默认的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)(其中 * 确实 * 给出错误),是因为trunc()是用特殊参数...定义的,当实现具有扩展函数的额外参数的自定义类时,它允许轻松扩展原始定义。从舍入函数manual

用法

ceiling(x)  
floor(x)  
trunc(x, ...)  
 
round(x, digits = 0)  
signif(x, digits = 6)

参数

x:数值向量。或者,对于roundsignif,是一个复向量。
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

相关问题