Làm cách nào để triển khai toán tử đường ống%>% trong chế độ ESS?


8

Gần đây, Rchứng kiến ​​sự giới thiệu thông minh của toán tử %>%hoặc toán tử đường ống thentrong mã mà tôi sử dụng khá thường xuyên hiện nay. Tôi tự hỏi nếu điều này đã được thực hiện trong phiên bản mới nhất của ESS . Nếu không, sẽ không có vấn đề gì khi đưa ra elispmã để viết hàm cho nó. Tôi cần phải thực hiện điều này để nó sẽ in toán tử %>%đó và sau đó nhảy sang một dòng thụt lề mới.

MWE

library(ggplot2)
library(dplyr)    
diamonds %>%
      filter(cut=="Ideal") %>%
      ggplot(aes(price)) +
      geom_histogram() +
      facet_wrap (~ color)

Thử nghiệm elisp của tôi - trong .init.elhoặc .emacstập tin:

(defun then_R_operator ()
  "%>% operator or 'then' pipe operator"
  (interactive)
  (insert " %>%") ; note the space before the first %
  (reindent-then-newline-and-indent))
(global-set-key (kbd "C-%") 'then_R_operator)  

Nó hoạt động, nhưng tôi muốn kiểm tra xem có gì sai với nó hay có bất kỳ đề xuất nào để cải thiện nó (là một người mới trong elisp). Làm thế nào để hạn chế điều này chỉ với ESSchế độ?

Lưu ý
Tôi nhận ra rằng việc khóa phông chữ %>%có thể được thực hiện bằng cách bật ess-fl-keyword:operatorstừ menu ESS.


Tôi sẽ chăm sóc cho nhân vật không gian (just-one-space 1)trước ống. Bạn muốn sử dụng ess-mode-map(và có thể là inferior-ess-mode-map) để đặt khóa (define-key ess-mode-map (kbd "C-%") 'then_R_operator).
mutbuerger 7/2/2015

cảm ơn! sự khác biệt giữa hai: inferior...và là ess-mode...gì?
tiến sĩ

ess-modekích hoạt chính nó khi chỉnh sửa, ví dụ, .Rcác tập tin. inferior-ess-modekích hoạt khi chạy một Rquá trình tương tác bên trong Emacs (tức là thông qua Rlệnh hoặc với lệnh C-c C-zgọi nào ess-switch-to-inferior-or-script-buffer).
hủy bỏ

@undostres cảm ơn. ý bạn là nếu tôi muốn xác định một khóa cho toán tử inferior...này thì điều này sẽ cho phép tôi sử dụng nó trong bảng điều khiển R tương tác, nằm trong Emacs? Nếu có thì tôi nghĩ sẽ tốt hơn nếu xác định khóa cho cả hai ess-modeinferior, phải không?
tiến sĩ

@doctorate Có.
hủy bỏ

Câu trả lời:


8

cảm ơn mutbuerger cho những bình luận hữu ích Hiện tại, tôi chỉ sử dụng cái này cho toán tử này để làm việc với ESS.

(defun then_R_operator ()
  "R - %>% operator or 'then' pipe operator"
  (interactive)
  (just-one-space 1)
  (insert "%>%")
  (reindent-then-newline-and-indent))
(define-key ess-mode-map (kbd "C-%") 'then_R_operator)
(define-key inferior-ess-mode-map (kbd "C-%") 'then_R_operator)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.