我编写了以下代码,试图从随机生成的数据集中查找所有素数。遗憾的是,似乎出了问题,任何人都可以帮助我。
set.seed(20171106)
n <- 10000
num <- sample(1:100000,n,replace=TRUE)
findPrime <- function(x){
apple<-c()
n<-length(x)
for(i in n){
if(any(x[i]%%(1:(x[i]-1))!=0)) apple <-c(apple,x[i])
}
return(apple)
}
获得结果: 类型:findPrime(NUM) 这是警告信息:
Warning message:
In if (x[i]%%(1:(x[i] - 1)) == 0) apple <- c(apple, x[i]) :
the condition has length > 1 and only the first element will be used
那我怎么解决这个问题呢?
答案 0 :(得分:0)
if
语句只接受单个元素,并且在您的声明中似乎获得了整个向量。我使用ifelse
循环中包含的sapply
表达式重写了您的函数。
我希望这适合你。
findPrime <- function(x = 0){
primes <- c()
# Prime finder
primes <- sapply(X = x,FUN = function(x) {
ifelse(any(x %% (1:(x - 1)) != 0), T, F)}
)
# Select primes
primes <- num[primes]
return(primes)
}
findPrime(num)
我已经检查了另一个愚蠢的错误...在选择素数步骤中num
的函数内部更改x
并反转F
,T
结果。它应该是这样的:
findPrime <- function(x = 0){
primes <- c()
# Prime finder
primes <- sapply(X = x,FUN = function(x) {
ifelse(any(x %% (2:(x - 1)) == 0), F, T)}
)
# Select primes
primes <- x[primes]
return(primes)
}
我刚尝试过,它运行正常。
答案 1 :(得分:-1)
使用包“gmp”,其函数为“isprime”,非素数返回0,素数返回2,然后根据相同的数据对数据进行子集
说你有一个向量a = c(1:10)
c
在你的代码中:for(i in 1:n),出现错误