2012-05-13 22 views
5

Tôi có một tập lệnh R xuất ra TRUE hoặc FALSE. Trong R, nó sử dụng một bona fide T/F kiểu dữ liệu, nhưng khi tôi vang giá trị trả về của nó để bash, nó có vẻ là một chuỗi, nói:Xuất một boolean từ một Rscript vào biến Bash

"[1] TRUE"

hoặc

"[1] FALSE"

Cả hai đều đứng trước [1]. Không phải là [0], đó không phải là lỗi đánh máy. Dù sao, kết quả của việc này là khi tôi thử kiểm tra đầu ra của bản Rscript này để chạy tập lệnh tiếp theo, tôi phải so sánh chuỗi với "[1] TRUE" như dưới đây, thay vì so sánh với "TRUE" hoặc " 1 "cảm thấy sạch hơn và tốt hơn.

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

Làm cách nào để R tạo đầu ra đúng Boolean hoặc Bash chấp nhận chuỗi đầu ra và chuyển đổi thành 0/1 để so sánh? Đó là, tôi muốn thử nghiệm cho ...

if [ $A == TRUE ]; 

hơn

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

Có phải đó là có thể, hay tôi nên được hạnh phúc với điều này, làm thế nào nó là, mà làm việc?

* CẬP NHẬT *

Dưới đây là phiên bản minimalized của Rscript mà tạo ra này ...

myinput <- TRUE #or FALSE 

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

FunctionName(myinput) 
+2

FYI, [1] là nói bạn đây là phần tử đầu tiên của vectơ. Nếu bạn in một vectơ có nhiều phần tử trong đó sao cho bản in mở rộng trên nhiều hàng, R sẽ giúp in [11], [21], [31] vv để bạn biết (ví dụ) bản in của nó 10 giá trị mỗi hàng. Nếu bạn in một ma trận nó nhãn các hàng và cột là [, 1] và [1,] cho bạn. – Spacedman

+1

Ngoài các giải pháp tốt được đưa ra dưới đây, tôi tin rằng bạn có thể sử dụng q (status = val) trong Rscript để nói giá trị nào được trả về shell từ Rscript. Hãy cẩn thận về điều này mặc dù nếu bạn đang làm việc với cộng tác viên - giá trị trả về thường được sử dụng để mã hóa thông báo lỗi để chúng có thể lấy giá trị trả về khác không đáng lo ngại thay vì chỉ chạy câu trả lời của nhà máy. – mweylandt

Trả lời

9

Thay vì sử dụng một trong hai print() hoặc in ngầm() - ing xảy ra khi tên đối tượng được cung cấp cho trình thông dịch R, bạn nên sử dụng cat() sẽ không thêm "[1]" vào trước TRUE hoặc FALSE. Nếu bạn muốn 0/1, hãy sử dụng cat(as.numeric(.)). Hãy thử điều này thay vì:

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

Nếu bạn cần mà giá trị để chế biến tiếp bạn cũng có thể sử dụng này:

cat(as.numeric(val)); invisible(val) 
+0

Điều này làm việc hoàn hảo. Cảm ơn bạn đã giới thiệu cho tôi vô hình(), quá. – Mittenchops

0

ngắn của việc thay đổi những gì kịch bản R của bạn không, bạn có thể làm một trong hai điều sau đây trên bên bash:

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

hoặc

if [[ $A =~ TRUE ]] 

Trong trường hợp thứ hai, với kết hợp regex, nó thường khuyến cáo rằng mô hình được đưa vào một biến:

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

nhưng trong trường hợp rõ ràng là đơn giản như thế này nó không cần thiết.

0

Bạn cũng có thể định nghĩa một hàm trong bash có thể chuyển đổi đầu ra R thành TRUE/FALSE:

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

Bây giờ bạn có thể sử dụng nó như:

A=$(r_to_bash "$A") 
if [ $A == TRUE ]; 
+0

Hoặc 'r_to_bash() {echo" $ {1 # *} "; } ' –

Các vấn đề liên quan