使用 bash (Windows 7) 调用 RScript 时的简单 lambda.R 脚本 STDOUT 有趣的事情
Simple lambda.R Script STDOUT funny business when invoking RScript with bash (Windows 7)
目标:
我需要调用 RScript 函数输出到 STDOUT
以进行重定向。
控制:控制脚本是
x = "Hello World"
x
另存为control.R
来自bash
$ RScript control.R
[1] "Hello World"
打破:
#!/usr/bin/env Rscript
# install.packages('lambda.r')
library('lambda.r')
greeting('en-US') %as% 'Hello'
greeting('en-GB') %as% 'Allo!'
greeting('en-AU') %as% 'GDay'
greeting('en-NZ') %as% 'Kia Ora!'
另存为greeting.R
来自bash
Master@L-BATESPRIME ~/Workspace/Lab/R
$ RScript greeting.R 'en-US'
Master@L-BATESPRIME ~/Workspace/Lab/R
$ RScript greeting.R 'en-NZ'
Master@L-BATESPRIME ~/Workspace/Lab/R
$ RScript greeting.R 'en-GB'
Master@L-BATESPRIME ~/Workspace/Lab/R
$
如果我在 运行R 会话中(在 RStudio
或 RGui
中)每当我调用 greeting('my_arg')
时,R 控制台都会回显正确的值。但是,每当我尝试通过 bash 中的 RScript 运行 脚本时,我都会得到一个空输出。我什至在命令行上附加了一个 System.Diagnostics.Process
来测试它,包裹在 STDIN
上并试图将 STDOUT
回显到控制台,但流包含一个空字符串。
如何获得:
Master@L-BATESPRIME ~/Workspace/Lab/R
$RScript greeting.R en-US
回应bash?
备注
除了缺少输出语句之外还有一些问题。具体来说,我认为需要发生以下情况:
- 脚本看不到传入的参数(例如
en-US
),因为没有设置接收它的语句(例如 args
)。
- 添加到脚本:
args = commandArgs(trailingOnly=TRUE); msg = args[2]
- 将调用修改为:
Rscript greeting.R --args en-US
- 您已定义,但未使用输入调用
greeting()
函数。因此,不会有输出。
- 要纠正此问题,请在函数声明后添加:
greeting(msg)
- 只给return问候语,附上
cat(...)
提议的更改
来自bash
Rscript greetings.R --args en-US
greetings.R
#!/usr/bin/env Rscript
# Grab the commands
args = commandArgs(trailingOnly=TRUE)
# Extract message
msg = args[2]
# Load in functional programming lib
library('lambda.r')
# Create functions
greeting('en-US') %as% 'Hello'
# install.packages('lambda.r')
library('lambda.r')
greeting('en-US') %as% 'Hello'
greeting('en-GB') %as% 'Allo!'
greeting('en-AU') %as% 'GDay'
greeting('en-NZ') %as% 'Kia Ora!'
# Call function with Greeting:
cat(greeting(msg),"\n")
期望的输出
zh-CN
$ Rscript greetings.R --args en-US
Hello
zh-CN
$ Rscript greetings.R --args en-GB
Allo!
等等...
目标:
我需要调用 RScript 函数输出到 STDOUT
以进行重定向。
控制:控制脚本是
x = "Hello World"
x
另存为control.R
来自bash
$ RScript control.R
[1] "Hello World"
打破:
#!/usr/bin/env Rscript
# install.packages('lambda.r')
library('lambda.r')
greeting('en-US') %as% 'Hello'
greeting('en-GB') %as% 'Allo!'
greeting('en-AU') %as% 'GDay'
greeting('en-NZ') %as% 'Kia Ora!'
另存为greeting.R
来自bash
Master@L-BATESPRIME ~/Workspace/Lab/R
$ RScript greeting.R 'en-US'
Master@L-BATESPRIME ~/Workspace/Lab/R
$ RScript greeting.R 'en-NZ'
Master@L-BATESPRIME ~/Workspace/Lab/R
$ RScript greeting.R 'en-GB'
Master@L-BATESPRIME ~/Workspace/Lab/R
$
如果我在 运行R 会话中(在 RStudio
或 RGui
中)每当我调用 greeting('my_arg')
时,R 控制台都会回显正确的值。但是,每当我尝试通过 bash 中的 RScript 运行 脚本时,我都会得到一个空输出。我什至在命令行上附加了一个 System.Diagnostics.Process
来测试它,包裹在 STDIN
上并试图将 STDOUT
回显到控制台,但流包含一个空字符串。
如何获得:
Master@L-BATESPRIME ~/Workspace/Lab/R
$RScript greeting.R en-US
回应bash?
备注
除了缺少输出语句之外还有一些问题。具体来说,我认为需要发生以下情况:
- 脚本看不到传入的参数(例如
en-US
),因为没有设置接收它的语句(例如args
)。- 添加到脚本:
args = commandArgs(trailingOnly=TRUE); msg = args[2]
- 将调用修改为:
Rscript greeting.R --args en-US
- 添加到脚本:
- 您已定义,但未使用输入调用
greeting()
函数。因此,不会有输出。- 要纠正此问题,请在函数声明后添加:
greeting(msg)
- 只给return问候语,附上
cat(...)
- 要纠正此问题,请在函数声明后添加:
提议的更改
来自bash
Rscript greetings.R --args en-US
greetings.R
#!/usr/bin/env Rscript
# Grab the commands
args = commandArgs(trailingOnly=TRUE)
# Extract message
msg = args[2]
# Load in functional programming lib
library('lambda.r')
# Create functions
greeting('en-US') %as% 'Hello'
# install.packages('lambda.r')
library('lambda.r')
greeting('en-US') %as% 'Hello'
greeting('en-GB') %as% 'Allo!'
greeting('en-AU') %as% 'GDay'
greeting('en-NZ') %as% 'Kia Ora!'
# Call function with Greeting:
cat(greeting(msg),"\n")
期望的输出
zh-CN
$ Rscript greetings.R --args en-US
Hello
zh-CN
$ Rscript greetings.R --args en-GB
Allo!
等等...