Câu hỏi Tạo R (gói thống kê) chờ lời nhắc bàn phím khi chạy trong một tập lệnh bash


Tôi đang sử dụng R để tạo ra một loạt các lô trong vòng một vòng, với người dùng nhấn phím enter để cho biết họ đã nhìn thấy cốt truyện và đó là thời gian để di chuyển trên. Đây là những mảnh tương tác xoay được tạo ra với gói rgl và do đó sử dụng một cái gì đó như Sys.sleep () là không đủ tốt.

Hiện tại tôi có thể sử dụng readline () mà các công trình tìm thấy khi chạy R tương tác. Tuy nhiên, nếu tôi muốn chạy tập lệnh R của mình trong một tập lệnh bash, tất cả các ô xuất hiện nhấp nháy trước màn hình. Điều này xảy ra cho dù tôi gọi R bằng cách sử dụng:

R --no-save -f myfile.r
R --no-save -e "source('myfile.r')"
R --no-save << myfile.r

Làm cách nào để nhận R tạm dừng và chờ người dùng nhấn khi chạy dưới dạng bash subprocess?


7
2017-10-04 21:34


gốc


Tại sao không chỉ viết các ô để gửi và cho phép người dùng mở chúng khi rảnh rỗi?
Jack - điều này sẽ yêu cầu một câu hỏi StackOverflow riêng biệt: cách viết các ô rgl 3d vào đĩa theo cách sao cho chúng có thể được tải (lý tưởng bởi trình duyệt web) và xoay theo sự giải trí của người dùng. Doable ngây thơ trong R - có (mã hóa điểm, màu sắc, biểu tượng, vv), nhưng tôi hy vọng tôi sẽ không phải đi đến đó. Nếu điều này dẫn đến một giải pháp di động dựa trên trình duyệt thì đó là một chiến thắng tiềm năng. Nếu không, đó là một quá trình bổ sung trong luồng công việc giải quyết một vấn đề mà R có thể tự mình thực hiện. - SetJmp
Đây là câu hỏi đồng hành: stackoverflow.com/questions/7663982/… - SetJmp


Các câu trả lời:


Dùng cái này:

readLines("stdin", n = 1)

Điều đó sẽ nhận được thực tế stdin thay vì những gì stdin() sử dụng.

Tôi sẽ gọi nó bằng:

Rscript myfile.r

3
2017-10-05 01:01



Điều này gần như hoạt động, nhưng nó làm cho các ô không tương tác (bị đóng băng). Thư viện đồ họa tôi đang sử dụng là rgl với hàm plot3d cho phép tôi xoay các ô. - SetJmp
Có vẻ như plot3d() có hành vi khác nhau khi R chạy không tương tác. Thay đổi đó là một câu hỏi hoàn toàn riêng biệt. Câu trả lời này sẽ giải đáp câu hỏi của bạn khi được hỏi. - Michael Hoffman


Đó là một câu trả lời trễ nhưng mục tiêu của tôi là tương tự: thực thi Rscript sẽ mang đến một cửa sổ rgl với một âm mưu và không có gì khác, và nó sẽ vẫn còn đó cho đến khi cửa sổ được đóng lại, tức là cửa sổ rgl không nên chấm dứt.

Để đạt được điều này, tôi chỉ đơn giản đặt nó ở cuối kịch bản R, và cốt truyện rgl sẽ vẫn ở đó để thao tác cho đến khi bạn thoát khỏi cửa sổ, tốn ít thời gian CPU:

play3d(function(time) {Sys.sleep(0.01); list()} )

Đối với các ô 2D R thông thường, locator() hoạt động tương tự, hoặc locator(1) nếu một cú nhấp chuột phải đóng cửa sổ lô.


3
2017-08-15 11:18



Hoạt động khá tốt, nhưng sẽ mở một cửa sổ thiết bị RGL mới, trống rỗng, đóng cửa sổ cũ và không bao giờ (?) Chấm dứt. - Raketenolli


Tôi không chắc chắn nếu có một cách dễ dàng để chờ đợi một đầu vào bàn phím, nhưng ít nhất bạn có thể chờ đợi click chuột.
Không thanh lịch nhưng hãy thử tập lệnh này:

quartz() # or maybe windows() in windows
for (i in 1:5) {plot(i, i); locator(1)}

2
2017-10-05 00:41



định vị có vẻ như mong đợi tôi sử dụng hàm plot (), tuy nhiên tôi đang sử dụng plot3d từ thư viện rgl. Ngoài ra, tôi sẽ thực hiện các cú click chuột khi tôi xoay cốt truyện theo cách thủ công mà có thể ảnh hưởng đến cách tiếp cận sử dụng các cú click chuột làm tín hiệu. - SetJmp


Dưới đây là một ví dụ kịch bản mà làm việc cho tôi (thử nghiệm phương pháp gọi đầu tiên của bạn trên cửa sổ). Nó sử dụng gói tcltk và tạo thêm một cửa sổ nhỏ với một nút duy nhất, kịch bản sẽ tạm dừng (nhưng vẫn cho phép bạn tương tác với cửa sổ rgl) cho đến khi bạn nhấp vào nút 'tiếp tục' khi nhấn một phím trong khi cửa sổ đó đang hoạt động, sau đó tiếp tục với tập lệnh.

library(tcltk)
library(rgl)

mywait <- function() {
    tt <- tktoplevel()
    tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)),
        side='bottom')
    tkbind(tt,'<Key>', function()tkdestroy(tt) )

    tkwait.window(tt)
}


x <- rnorm(10)
y <- rnorm(10)
z <- rnorm(10)

plot3d(x,y,z)

mywait()

x <- rnorm(100)
y <- rnorm(100)
z <- rnorm(100)

plot3d(x,y,z)

mywait()

cor(x,y)

1
2017-10-05 16:08





plot.lm sử dụng devAskNewPage(TRUE); có lẽ điều đó cũng sẽ hoạt động ở đây.


0
2017-10-05 14:49



Nhưng tôi sợ nó không hiệu quả cho trường hợp của tôi. (thư viện rgl) - SetJmp
Than ôi. Cảm ơn các cập nhật. - Aaron