无法获得R循环执行

时间:2015-09-15 12:05:51

标签: r

我从R开始尝试让这个循环执行。我试图让循环使用函数计算坐标之间的连续距离(Vincenty的公式)。 'Distfunc'是函数的文件。然后通过下面的'x'调用该函数。我想要的只是一个数据框或坐标之间的距离列表。很有帮助!

Distfunc <- source("F://Distfunc.R")
for (i in length(Radians)) {
    LatRad1 <- Radians[i,1]
    LongRad1 <- Radians[i,2]
    LatRad2 <- Radians[i+1,1]
    LongRad2 <- Radians[i+1,2]
    x <- gcd.vif(LongRad1, LatRad1, LongRad2, LatRad2) 
    print(data.frame(x[i]))
}

1 个答案:

答案 0 :(得分:1)

好吧,如果没有对您所面临的问题进行良好描述并且是一个正确的可重复示例,则很难提供任何有益的见解。首先,请参阅How to make a great R reproducible example?

有许多事情在你做事的方式上并不清楚。首先,为什么要将source(...)的结果分配给变量Distfunc

无论如何,这里有一些代码,我试图理解这一点;它运行没有问题,但它不能完成你所期望的(因为你没有提供太多的信息)。特别是,codet使用Mario Pineda-Krch(http://www.r-bloggers.com/great-circle-distance-calculations-in-r/)的函数gcd.vif的实现。下面的代码旨在明确,因为你提到你是从R开始。

# Calculates the geodesic distance between two points specified by radian latitude/longitude using
# Vincenty inverse formula for ellipsoids (vif)
# By Mario Pineda-Krch (http://www.r-bloggers.com/great-circle-distance-calculations-in-r/)
gcd.vif <- function(long1, lat1, long2, lat2) {

    # WGS-84 ellipsoid parameters
    a <- 6378137 # length of major axis of the ellipsoid (radius at equator)
    b <- 6356752.314245 # ength of minor axis of the ellipsoid (radius at the poles)
    f <- 1/298.257223563 # flattening of the ellipsoid

    L <- long2-long1 # difference in longitude
    U1 <- atan((1-f) * tan(lat1)) # reduced latitude
    U2 <- atan((1-f) * tan(lat2)) # reduced latitude
    sinU1 <- sin(U1)
    cosU1 <- cos(U1)
    sinU2 <- sin(U2)
    cosU2 <- cos(U2)

    cosSqAlpha <- NULL
    sinSigma <- NULL
    cosSigma <- NULL
    cos2SigmaM <- NULL
    sigma <- NULL

    lambda <- L
    lambdaP <- 0
    iterLimit <- 100
    while (abs(lambda-lambdaP) > 1e-12 & iterLimit>0) {
        sinLambda <- sin(lambda)
        cosLambda <- cos(lambda)
        sinSigma <- sqrt( (cosU2*sinLambda) * (cosU2*sinLambda) +
            (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda) )
        if (sinSigma==0) return(0)  # Co-incident points
        cosSigma <- sinU1*sinU2 + cosU1*cosU2*cosLambda
        sigma <- atan2(sinSigma, cosSigma)
        sinAlpha <- cosU1 * cosU2 * sinLambda / sinSigma
        cosSqAlpha <- 1 - sinAlpha*sinAlpha
        cos2SigmaM <- cosSigma - 2*sinU1*sinU2/cosSqAlpha
        if (is.na(cos2SigmaM)) cos2SigmaM <- 0  # Equatorial line: cosSqAlpha=0
        C <- f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha))
        lambdaP <- lambda
        lambda <- L + (1-C) * f * sinAlpha *
            (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)))
        iterLimit <- iterLimit - 1
    }
    if (iterLimit==0) return(NA)  # formula failed to converge
    uSq <- cosSqAlpha * (a*a - b*b) / (b*b)
    A <- 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)))
    B <- uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)))
    deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM^2) -
        B/6*cos2SigmaM*(-3+4*sinSigma^2)*(-3+4*cos2SigmaM^2)))
    s <- b*A*(sigma-deltaSigma) / 1000
    return(s) # Distance in km
}

# Initialize the variable 'Radians' with random data
Radians <- matrix(runif(20, min = 0, max = 2 * pi), ncol = 2)

lst <- list() # temporary list to store the results
for (i in seq(1, nrow(Radians) - 1)) { # loop through each row of the 'Radians' matrix
    LatRad1 <- Radians[i, 1]
    LongRad1 <- Radians[i, 2]
    LatRad2 <- Radians[i + 1, 1]
    LongRad2 <- Radians[i + 1, 2]
    gcd_vif <- gcd.vif(LongRad1, LatRad1, LongRad2, LatRad2)

    # Store the input data and the results
    lst[[i]] <- c(
        latitude_position_1 = LatRad1, 
        longtude_position_1 = LongRad1, 
        latitude_position_2 = LatRad2, 
        longtude_position_2 = LongRad2, 
        GCD = gcd_vif
    )
}
Results <- as.data.frame(do.call(rbind, lst)) # store the input data and the results in a data frame