R:编写一个以向量为输入的函数

时间:2016-03-16 01:50:55

标签: r

我最近开始学习R并且不知道如何写这个:

编写一个函数,其输入为向量,其中每个元素是一个低于500 000 000的正整数,并返回输入向量的每个元素,这是一个多维数据集编号。

当我得到单个值x时,我通常以:

开头
my.function <- function(x) {

但是,如果我想要一个如上所述的矢量怎么办? 我正在考虑将x定义如下:

my.function <- function(x) { 
x <- c(0<n<500000000)

但这不起作用。 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

在创建函数方面,您不需要做任何不同的事情,因为@Adam正确地说明了。

my_function = function(x){} 

就是你所需要的。

在此之后,您可以检查输入是否符合您的约束。例如:

my_function = function(x){
    if(!is.vector(x))
        stop("Not a vector")

    if(any(x < 0 | x > 500000))
        stop("Does not fit constraints")
}

答案 1 :(得分:0)

也许:

 x [ mapply( function(xx,yy) {isTRUE(all.equal(xx,yy))}, 
                 xx=(x) ^ (1/3) , 
                 yy=round(  (x) ^ (1/3), 0 ) ) ]

> x <- 1:512  # to get your desired range it would be `seq.int(500000000)`
> x[ mapply( function(xx,yy) {isTRUE(all.equal(xx,yy))}, 
                xx=(x) ^ (1/3) , 
                yy=round(  (x) ^ (1/3), 0 ) ) ]
[1]   1   8  27  64 125 216 343 512

我认为500 000 000低于integer.max或max.integer。您应该检查.Machine

(这将会很慢。更好的算法是可能的,也许这可能是教练想要的。)

> x <- seq.int(50000)
> cubes
 [1]    1    8   27   64  125  216  343  512  729 1000 1331 1728 2197 2744 3375
[16] 4096 4913
> cubes <- x[ mapply( function(xx,yy) {isTRUE(all.equal(xx,yy))}, xx=(x) ^ (1/3) , yy=round(  (x) ^ (1/3), 0 ) ) ]
> cubes
 [1]     1     8    27    64   125   216   343   512   729  1000  1331  1728
[13]  2197  2744  3375  4096  4913  5832  6859  8000  9261 10648 12167 13824
[25] 15625 17576 19683 21952 24389 27000 29791 32768 35937 39304 42875 46656

我怀疑这是x

长度的线性
> x <- seq.int(500000)
> system.time( {cubes <- x[ mapply( function(xx,yy) {isTRUE(all.equal(xx,yy))}, xx=(x) ^ (1/3) , yy=round(  (x) ^ (1/3), 0 ) ) ] } )
   user  system elapsed 
105.455   1.110 107.138 

这只需要检查相对较少的值,因为最大值的立方根只有793加上一小部分:

x[ x %in% (1:(max(x)^(1/3)) )^3]   # almost instantaneous with x <- 1:500000
#   ==== testing worst case scenario ====
> x <- 1:500000000
> system.time( {cubes <- x[ x %in% (1:(max(x)^(1/3)) )^3]})
   user  system elapsed 
 25.025   8.379  32.857   # that's in seconds