假设我有许多.gpx文件(这些文件包含来自Garmin eTrex的GPX航路点数据).我想用不同的名称将它们加载到R中并操纵它们.
我可以这样读一个文件:
library(maptools)
gpx.raw <- readGPS(i = "gpx", f = "file1_w_12_f_ddf.gpx", type="w")
Run Code Online (Sandbox Code Playgroud)
假设我想将其中的一些读入内存.我可以尝试for循环:
files <- list.files(".",pattern = "*.gpx")
for(x in files){
#Create new file name
temp <- strsplit(x,"_",fixed=TRUE)
visit.id <- sapply(temp,FUN=function(x){paste(x[1],x[4],substr(x[5],1,3),sep="_")})
#read file with new filename
assign(visit.id, readGPS(i = "gpx", f = x, type="w"))
}
Run Code Online (Sandbox Code Playgroud)
在程序上运行会产生以下错误:
read.table出错(con < - textConnection(gpsdata),fill = TRUE,...):输入中没有可用的行另外:警告消息:运行命令'C:\ PROGRA~2\GPSBabel\gpsbabel.exe - w -i gpx -f file1_w_12_f_ddf.gpx -o tabsep -F - '状态为1
请注意,我能够自己读取此文件,因此它似乎与文件本身无关,而是在循环中运行readGPS.
一般来说,我仍然觉得R处理像上面的x这样的变量非常困惑.我不知道如何从独立的情况下修改参数readGPS f = "file1_w_12_f_ddf.gpx":它应该是x,或f = x,或者f = "x",还是什么?或者问题可能在于对GPSBabel的调用......
我在下面包含一个示例文件,因此您可以将其复制到文本编辑器,并保存为.gpx.两次有不同的名字,并尝试自己.
<?xml version="1.0" encoding="UTF-8"?>
<gpx
version="1.0"
creator="GPSBabel - http://www.gpsbabel.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
<time>2010-09-14T18:35:43Z</time>
<bounds minlat="18.149888897" minlon="-96.747799935" maxlat="50.982883293" maxlon="121.640266674"/>
<wpt lat="38.855549991" lon="-94.799016668">
<ele>325.049072</ele>
<name>GARMIN</name>
<cmt>GARMIN</cmt>
<desc>GARMIN</desc>
<sym>Flag</sym>
</wpt>
<wpt lat="50.982883293" lon="-1.463899976">
<ele>35.934692</ele>
<name>GRMEUR</name>
<cmt>GRMEUR</cmt>
<desc>GRMEUR</desc>
<sym>Flag</sym>
</wpt>
<wpt lat="25.061783362" lon="121.640266674">
<ele>38.097656</ele>
<name>GRMTWN</name>
<cmt>GRMTWN</cmt>
<desc>GRMTWN</desc>
<sym>Flag</sym>
</wpt>
</gpx>
Run Code Online (Sandbox Code Playgroud)
注意:要运行readGPS,您需要在PATH变量中安装和引用开源GPSBabel程序.
弗雷德,
安装GPSBabel并更新PATH变量后,您的代码段运行正常.我有两个对象名称test1.gpx_NA_NA和test2.gpx_NA_NA三个28个变量的观察.是对的吗?我假设文件名中的NA位是由于你如何定义visit.id而我的测试文件名不符合该范例.
你是否在一个新的R实例上试过这个?
FWIW,我可能会将所有这些文件读入单个列表对象.我发现处理列表对象比放置许多不同的对象更容易.例如,
files <- dir(pattern = "\\.gpx")
#Replace all space characters with a "_". Replace with the character of your choice.
lapply(files, function(x) file.rename(from = x, to = gsub("\\s+", "_", x)))
#Reread in files with better names:
files <- dir(pattern = "\\.gpx")
out <- lapply(files, function(x) readGPS(i = "gpx", f = x, type = "w"))
names(out) <- files
Run Code Online (Sandbox Code Playgroud)
而out现在是2的列表,其中的每个对象是与它与之前相关的文件的名称data.frame.使用*apply家庭中的东西也有利于留下干净的工作空间.在使用for循环的结果x,temp和visit.id后记挂出.你可以将它们包装成一个函数调用,但lapply我认为只是使用它会更直接.
事实证明代码没问题,问题出在文件名上。GPSBabel 不喜欢带有空格的名称。所以“1_San Jos\xc3\xa9 Baldi_Pernam_14_sep.gpx”是一个问题,“1_San_Jos\xc3\xa9_Baldi_Pernam_14_sep.gpx”不是。
\n