函数 returns 0x0 table

Function returns 0x0 table

我有一个计算纬度和经度点的函数,以便在中心位置周围创建 "ring"。问题是结果打印到屏幕上但没有存储在任何地方。我的函数创建了一个包含 0 列和 0 行的数据框。我希望能够获取这些坐标并在其他地方使用它们。我也希望能够嵌套此函数,但当它没有 return 任何东西时我无法真正嵌套它。

我的最终目标是创建 kml 代码。我已经有了 kml 代码,但需要重复多次。 kml 代码创建半径环,用颜色填充它们,并为地点添加名称。我想使用 lat/lon.

中的位置列表自动生成文件

我的问题是,我怎样才能将此函数用于 return 我想要的坐标列表,以便我可以将它们相应地粘贴到 kml 代码中?我可以使用 adply 使其循环并获得 3 个坐标的打印结果,但没有创建任何内容。

我对编码也很陌生,请温柔。提前致谢。

make.ring.file=function(dist,df)
{

  R = 6378.14 #Radius of the Earth
  d = dist*1.609344 #Distance of ring radius in km
  lat1 = df$lat*(pi/180) #Current lat point converted to radians
  lon1 = df$lon*(pi/180) #Current lon point converted to radians
  num3=0
  index=seq(from=0,to=360,by=120)
  bear=NULL
  lat=NULL
  lon=NULL
  z=NULL
  coordlist=NULL
    for(n in 1:length(index))
    {
      bear[n]=index[n]*(pi/180)
      lat[n]=(asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(bear[n])))*(180/pi)
      lon[n]=(lon1 + atan2(sin(bear[n])*sin(d/R)*cos(lat1),
                         cos(d/R)-sin(lat1)*sin(lat[n]*(pi/180))))*(180/pi)
      z[n]=0
     coordlist[n]=paste(lon[n],lat[n],z[n],sep=",")  
    }  
     return(data.frame(cat(coordlist,"\n","\n")))

}

> head(x1)
       lat       lon
1 38.86095 -86.51672
2 30.63275 -84.41614
3 31.53697 -87.88780

> results=adply(x1,1,make.ring.file,dist=30)
-86.51672,39.2946592897837,0 -86.0358241901732,38.6431079084023,0 -86.9976158098268,38.6431079084023,0 -86.51672,39.2946592897837,0 

-84.41614,31.0664592897837,0 -83.9805971533182,30.4151694949636,0 -84.8516828466818,30.4151694949636,0 -84.41614,31.0664592897837,0 

-87.8878,31.9706792897837,0 -87.4481292235866,31.3193631233201,0 -88.3274707764134,31.3193631233201,0 -87.8878,31.9706792897837,0 

> str(results)
'data.frame':   0 obs. of  0 variables

> is.data.frame(results)
[1] TRUE

我想这就是你想要的:

make.ring.file=function(dist,df)
{

    R = 6378.14 #Radius of the Earth
    d = dist*1.609344 #Distance of ring radius in km
    lat1 = df$lat*(pi/180) #Current lat point converted to radians
    lon1 = df$lon*(pi/180) #Current lon point converted to radians
    num3=0
    index=seq(from=0,to=360,by=120)
    bear=NULL
    lat=NULL
    lon=NULL
    z=NULL
    coordlist=NULL
    for(n in 1:length(index))
    {
        bear[n]=index[n]*(pi/180)
        lat[n]=(asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(bear[n])))*(180/pi)
        lon[n]=(lon1 + atan2(sin(bear[n])*sin(d/R)*cos(lat1),
                             cos(d/R)-sin(lat1)*sin(lat[n]*(pi/180))))*(180/pi)
        z[n]=0
        coordlist[n]=paste(lon[n],lat[n],z[n],sep=",")  
    }  
    return(data.frame(out=paste(coordlist,collapse=" ")))

}

关键的补充是:

return(data.frame(out=paste(coordlist,collapse=" ")))

函数 cat 打印到控制台,因此您不能将其分配给任何东西 - 您只是制作一个空的 data.frame 并打印。

粘贴命令的工作原理是将 coordlist 的 4 行粘贴在一起,分隔符为“ ”。您可以根据下游代码的需要修改它。