有人可以帮助我,我不明白这里有什么问题。我刚刚开始学习R(几天前)。在这里,我必须构建一个函数,在创建Marsenne数字后,它将为我提供所有Marsenne素数。我创建了3个函数: 1)factorlist只是找到一个数字的所有因子 2)Marsenne数是一个创建Marsenne数的函数 3)CheckForMersennePrimes是一个检查已建立的Mersenne数是否为素数的函数。 ***函数“primes”给出了从0到x
的所有主要数字问题是: 前2个功能完美运行。但第三个不起作用,并给出以下错误。我无法理解什么是错的。我试图做的是因为Mersenne数字不是全部素数,我会查看MersenneNumber的集合并检查其中的每个元素是否为素数然后将其删除。
有人可以帮助找到错误吗?
以下是我的功能:
factorlist<-function(x) {
if (x<2) {return ("Invalid input")}
if (x%%1!=0) {return ("Invalid input")}
if (x==2) {return(2)}
if (x==3) {return(3)}
vec<-0
for(i in 1:x){
if(x%%i==0){
vec[length(vec)]<-i
vec<-c(vec,0)
}
}
vec<-vec[-length(vec)]
vec<-vec[-length(vec)]
return(vec)
}
primes <- function(n){
primesR <- function(p, i = 1){
f <- p %% p[i] == 0 & p != p[i]
if (any(f)){
p <- primesR(p[!f], i+1)
}
p
}
primesR(2:n)
}
MarsenneNumber<-function(x){
vec<-c(0)
for (i in 3:x){
vec<-union(vec, c(2^primes(i)-1))
}
return(vec[-length(1)])
}
CheckForMersennePrimes<-function(x){
b<-length(MarsenneNumber(x)){
for (i in 1:b){
vec<-MarsenneNumber(x){
if (factorlist(vec[i])!=1){
vec<-c(-vec[i])
}
}
}
}
return(vec)
}
我错过了最后的功能:
Error: unexpected '}' in " }"
> }
Error: unexpected '}' in " }"
> }
Error: unexpected '}' in " }"
> return(vec)
Error: no function to return from, jumping to top level
> }
Error: unexpected '}' in "}"
以下是此功能的工作原理示例。
> factorlist(20)
[1] 1 2 4 5 10
> primes(20)
[1] 2 3 5 7 11 13 17 19
> MarsenneNumber(20)
[1] 3 7 31 127 2047 8191 131071 524287
答案 0 :(得分:3)
CheckForMersennePrimes
在此功能的第2行和第4行(for循环内)中有额外的{}
,例如vec<-MarsenneNumber(x){if()...}
我删除了那些额外的括号。
CheckForMersennePrimes <- function( x ){
b <- length( MarsenneNumber( x ) )
for ( i in 1:b ){
vec <- MarsenneNumber( x )
if ( factorlist( vec[i] ) != 1 ){
vec <- c( -vec[i] )
}
}
return( vec )
}
我认为,您的目的是获取vec
等于factorlist(vec[i])
的值。如果这是真的,那么您必须在for循环之外启动vec
检查这个条件。然后最后返回包含通过a1
条件的所有vec
值的if
。
我还删除了b
变量,从而缩短了代码。你不需要它。相反,你可以做seq_along(vec)
。没有b
变量,它会做同样的事情。
CheckForMersennePrimes <- function( x ){
vec <- MarsenneNumber( x )
a1 <- c()
for ( i in seq_along( vec ) ){
if ( factorlist( vec[i] ) == 1 ){
a1 <- c( a1, vec[i ] )
}
}
return( a1 )
}
进一步压缩代码将提供相同的输出。我删除了seq_along
并将vec
CheckForMersennePrimes <- function( x ){
vec <- MarsenneNumber( x )
a1 <- c()
for ( i in vec ){
if ( factorlist( i ) == 1 ) {
a1 <- c( a1, i )
}
}
return( a1 )
}