在Windows上使用stdout=TRUE调用system2时嵌入的nul警告
尝试通过在Windows上使用stdout=TRUE调用system2时嵌入的nul警告,r,system2,R,System2,尝试通过system2界面使用wmic检索当前流程命令行信息时: system2( command=“wmic”, args=paste0(“process where processid=,Sys.getpid(),“get commandline”), stdout=TRUE ) 我得到以下输出和警告: [1] "ÿþC" "" "" "" "" Warning messages: 1: In readLines(rf) : line 1 appears to co
system2
界面使用wmic
检索当前流程命令行信息时:
system2(
command=“wmic”,
args=paste0(“process where processid=,Sys.getpid(),“get commandline”),
stdout=TRUE
)
我得到以下输出和警告:
[1] "ÿþC" "" "" "" ""
Warning messages:
1: In readLines(rf) : line 1 appears to contain an embedded nul
2: In readLines(rf) : line 2 appears to contain an embedded nul
3: In readLines(rf) : line 3 appears to contain an embedded nul
4: In readLines(rf) : line 4 appears to contain an embedded nul
5: In readLines(rf) : line 5 appears to contain an embedded nul
6: In readLines(rf) :
incomplete final line found on '...\Temp\RtmpaWqnBy\file1284c476b1'
有趣的是,当使用系统
获得相同的期望输出(当前进程的命令行信息)时,它似乎工作正常:
系统(
command=paste0(“wmic process where processid=,Sys.getpid(),“get commandline”),
实习生=正确
)
输出:
[1] "CommandLine \r" "\"C:\\Program Files\\R\\R-3.6.2\\bin\\x64\\Rgui.exe\" --cd-to-userdocs \r"
[3] "\r"
另外,system2
withstdout=“
将输出打印到控制台:
system2(
command=“wmic”,
args=paste0(“process where processid=,Sys.getpid(),“get commandline”),
stdout=“”
)
我尝试以不同的方式将args
参数指定给system2
,但没有成功。
有人能解释一下这些警告吗?下面是一些sessionInfo
:
- R版本3.6.2(2019-12-12),在Windows 10 x64下运行
- 平台:x86_64-w64-mingw32/x64(64位)
- 地点:LC_COLLATE=English_ukin.1252
- 在活动的R会话中,此问题仅在RGui中对我显示,而不是在RStudio中或从命令提示符(cmd.exe)运行的R会话中
- 当代码在启动时执行(例如通过.Rprofile)时,它同时显示在RGui和RStudio中,但不显示在从命令提示符(cmd.exe)创建的R进程中
system
返回正确,system2也可以正常工作-除非stdout=TRUE
Hmm。我想知道它是否与。似乎您可以设置stdout=“file.out”
并将数据发送到那里。但数据似乎被编码为UTF-16,这似乎是造成问题的原因。您不能只对该文件执行readLines()
,而这正是system2
试图执行的操作。您需要执行类似于读取行(file(“file.out”,encoding=“UTF-16”)的操作。我看到在system2
代码中有一个对.Platform$GUI==“Rgui”
的检查,所以可能是这个分支导致了问题,而不是导致了RStudio的问题?有趣的是,我在R3.6.3中遇到了这个问题,但在R3.5.2中没有,我看到system2()
得到了重大的改进。另外,如果我debug()
system2()
在记事本++或十六进制编辑器中查看tempfile,我发现该文件编码为“UCS-2 LE BOM”。转换文件并继续操作将得到所需的结果。所以,我说这是system2()
中的一个bug:它创建了一个实际上无法读取的文件。一个补丁是将readLines()
调用替换为readLines(file(rf,encoding=“UCS-2LE”)
,但这通常可能(将?)不起作用。
CommandLine
"C:\Program Files\R\R-3.6.2\bin\x64\Rgui.exe" --cd-to-userdocs