我最近开始学习R并且不知道如何写这个:
编写一个函数,其输入为向量,其中每个元素是一个低于500 000 000的正整数,并返回输入向量的每个元素,这是一个多维数据集编号。
当我得到单个值x时,我通常以:
开头my.function <- function(x) {
但是,如果我想要一个如上所述的矢量怎么办? 我正在考虑将x定义如下:
my.function <- function(x) {
x <- c(0<n<500000000)
但这不起作用。 我怎么能这样做?
答案 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