使用 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 会话中(在 RStudioRGui 中)每当我调用 greeting('my_arg') 时,R 控制台都会回显正确的值。但是,每当我尝试通过 bash 中的 RScript 运行 脚本时,我都会得到一个空输出。我什至在命令行上附加了一个 System.Diagnostics.Process 来测试它,包裹在 STDIN 上并试图将 STDOUT 回显到控制台,但流包含一个空字符串。

如何获得:

Master@L-BATESPRIME ~/Workspace/Lab/R
$RScript greeting.R en-US

回应bash?

备注

除了缺少输出语句之外还有一些问题。具体来说,我认为需要发生以下情况:

  1. 脚本看不到传入的参数(例如 en-US),因为没有设置接收它的语句(例如 args)。
    • 添加到脚本:args = commandArgs(trailingOnly=TRUE); msg = args[2]
    • 将调用修改为:Rscript greeting.R --args en-US
  2. 您已定义,但未使用输入调用 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! 

等等...