使用 R 中的系统函数将文件路径作为命令的一部分传递的问题

问题描述 投票:0回答:0

我正在尝试使用 R 中的系统函数在 Windows 中使用命令提示符执行命令。

我修改了 R 包 GreKro/cloudcompare 中的一个函数,以将我想从命令提示符执行的命令保存为一个名为“cmd”的对象

对象cmd包括一个可执行文件(Cloud Compare),然后打开一个文件并执行Cloud Compare功能。

这是我在 R 中打印时的对象 cmd

"\"C:\\Program Files\\CloudCompare\\CloudCompare.exe\"   -C_EXPORT_FMT ASC -EXT asc -O “C:/Users/username/Documents/myfile.las” -ROUGH 1.19  -SAVE_CLOUDS FILE"

当我运行函数

system("cmd.exe", input = cmd)
CloudCompare 启动时,但在打开文件“C:/Users/username/Documents/myfile.las”时失败并给我一个错误提示:[加载] 无法猜测文件格式:未处理文件扩展名“las”。R 控制台打印以下内容:
C:\Users\username\Documents>"C:\Program Files\CloudCompare\CloudCompare.exe"   -C_EXPORT_FMT ASC -EXT asc -O “C:/Users/username/Documents/myfile.las” -ROUGH 1.19  -SAVE_CLOUDS FILE 

因为错误显示“las”',在 las 之后有双引号,我怀疑这是我提供的文件路径周围的格式和/或引号的问题,但我无法弄清楚。

注意事项:

  • 当我将
    system("cmd.exe", input = cmd)
    直接运行到 Windows 命令提示符后粘贴到 R 控制台中打印的内容时,Cloud Compare 命令按预期工作
  • 当我在 R 中使用云比较可执行文件路径或使用 cmd 对象语法的输入文件文件路径运行“system()”时,两者都按预期打开

以下是我尝试更改输入文件路径语法的不同方法,但没有成功:

file_1 <- shQuote('C:\\Users\\username\\Documents\\myfile.las')

file_2 <- file.path("C:", "Users", "username", "Documents", "myfile.las")

file_3 <- shQuote(file_2)

以下是我所有的代码:

library(lidR)

roughness <- function(file, radius=1, 
                      filter_sf= F, filter_value=c(0,1),
                    c_export_fmt= 'ASC', c_ext= 'asc', silent= T, no_timestamp= T) {
  
  
  if(class(file) != 'character' ){
    stop(paste('Wrong file is a ', class(file),', must be a character'))
    
  }
  
  
  
  if(class(radius) != 'numeric' ){
    stop(paste('Wrong nop is a ', class(file),', must be a numeric'))
    
  }
  
  
  
  if(class(filter_sf) != "logical" ){
    stop('Wrong filter_sf must be a logical value - TRUE or FALSE')
  }
  
  
  if(length(filter_value) != 2){
    stop('Wrong filter_value must be vector with 2 values for minimum and maximum treshold in filter_sf tool')
  }
  
  

  
  if(class(no_timestamp) != "logical" ){
    stop('Wrong no_timestamp must be a logical value - TRUE or FALSE')
  }
  
  if(!c_export_fmt %in% c('ASC','BIN', 'PLY', 'LAS', 'E57', 'VTK', 'PCD', 'SOI', 'PN', 'PV')){
    stop(paste('Wrong c_export_fmt: ',c_export_fmt,' (',class(c_export_fmt),'), must be character value, one of these : ASC, BIN, PLY, LAS, E57, VTK, PCD, SOI, PN, PV',sep=''))
    
  }
  
  if( (!c_ext %in% c('ASC','BIN', 'PLY', 'LAS', 'LAZ', 'E57', 'VTK', 'PCD', 'SOI', 'PN', 'PV') && !c_ext %in% tolower(c('ASC','BIN', 'PLY', 'LAS','LAZ', 'E57', 'VTK', 'PCD', 'SOI', 'PN', 'PV'))) ){
    stop(paste('Wrong c_ext: ',c_ext,' (',class(c_ext),'),
               must be character value, one of these :
               ASC,BIN, PLY, LAS, LAZ, E57, VTK, PCD, SOI, PN, PV
               or
               asc, bin, ply, las, laz, ,e57, ,vtk, pcd, soi, pn, pv',sep=''))
    
  }
  
  

  
  if (silent==T){
    s1= '-SILENT'
    
  }else{
    s1= ''
  }
  
  
  if (no_timestamp== T) {
    s2= '-NO_TIMESTAMP'
  } else{
    s2=''
  }
  
  s3= paste('-C_EXPORT_FMT',c_export_fmt,'-EXT',c_ext,sep=' ')
  
    
  s4= paste('-O', dQuote(file), sep=' ')
  
  
  
  
  s5= paste('-ROUGH', radius, sep=' ')
  
  if (filter_sf == T) {
    s6= paste('-FILTER_SF',filter_value[1], filter_value[2], sep=' ')
  } else{
    s6=''
  }
  
  
  s7= paste('-SAVE_CLOUDS' , 'FILE')
  
  
  CCdir= 'C:\\Program Files\\CloudCompare\\CloudCompare.exe'
  CC_dir <- shQuote(CCdir)
  
  cc_syntax <- paste(CC_dir, s1,s2,s3,s4,s5,s6,s7,sep=' ')

  
  return(cc_syntax)
}


file_1 <- shQuote('C:\\Users\\username\\Documents\\myfile.las')

file_2 <- file.path("C:", "Users", "username", "Documents", "myfile.las")

file_3 <- shQuote(file_2)

cmd <- roughness(file = file_2, radius = 1.19,
             silent=FALSE, no_timestamp = FALSE)

system("cmd.exe", input = cmd)
r command-prompt double-quotes las cloudcompare
© www.soinside.com 2019 - 2024. All rights reserved.