7

我有一个输出 TRUE 或 FALSE 的 R 脚本。在 R 中,它使用真正的 T/F 数据类型,但是当我将它的返回值回显到 bash 时,它似乎是一个字符串,说:

"[1] TRUE"

或者

"[1] FALSE"

它们都以 [1] 开头。[0] 也不是,这不是错字。无论如何,结果是当我尝试在此 Rscript 的输出上进行测试以运行后续脚本时,我必须如下对“[1] TRUE”进行字符串比较,而不是与“TRUE”或“ 1" 感觉更干净更好。

A=$(Rscript ~/MyR.r)
echo $A
if [ "$A" == "[1] TRUE" ]; then
    bash SecondScript.sh
fi

如何让 R 输出一个真正的布尔值,或者 Bash 接受输出字符串并将其转换为 0/1 以进行比较?也就是说,我宁愿测试...

if [ $A == TRUE ];

if [ "$A" == "[1] TRUE" ];

这可能吗,或者我应该对此感到满意,它是如何工作的?

*** 更新 ***

这是生成这个的 Rscript 的最小化版本......

myinput <- TRUE #or FALSE

FunctionName <- function(test){
  if (test == TRUE){
    val <- TRUE
  } else {
    val <- FALSE
  }
  return(val)
}

FunctionName(myinput)
4

4 回答 4

12

当对象名称提供给 R 解释器时,不应使用 print() 或隐式 print()-ing,而应使用cat()不会在 TRUE 或 FALSE 前面添加“[1]”。如果你想要 0/1,那么使用cat(as.numeric(.)). 试试这个:

myinput <- TRUE #or FALSE
FunctionName <- function(test){
   if (test == TRUE){
              val <- TRUE
                    } else {
              val <- FALSE
            }
   cat(as.numeric(val))
}
FunctionName(myinput)

如果您需要该值进行进一步处理,您也可以使用它:

cat(as.numeric(val)); invisible(val)
于 2012-05-13T20:46:14.083 回答
1

您还可以在 bash 中定义一个函数,将 R 输出转换为 TRUE/FALSE:

r_to_bash() {
  echo "$1" | cut -d' ' -f2
}

现在你可以像这样使用它:

A=$(r_to_bash "$A")
if [ $A == TRUE ];
于 2012-05-13T21:32:11.033 回答
1

您还可以将脚本的最后一行更改为:

write( FunctionName( myinput ), stdout())

这将只打印TRUE没有 [1] 的。

于 2018-07-24T19:36:42.490 回答
0

除了更改 R 脚本的功能之外,您还可以在 Bash 端执行以下任一操作:

if [[ $A == *TRUE* ]]

或者

if [[ $A =~ TRUE ]]

在第二种情况下,使用正则表达式匹配,通常建议将模式放入变量中:

pattern=TRUE
if [[ $A =~ $pattern ]]

但在诸如此类的明显简单的情况下,没有必要。

于 2012-05-13T21:23:34.290 回答