Câu trả lời:
Không, không, xem: Định nghĩa ngôn ngữ R: Toán tử
Theo dõi @ GregaKešpret, bạn có thể tạo một toán tử infix:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
trả lại x = (x + y)/2
. Thêm dấu ngoặc đơn, tức là x = %+=% (y/2)
giải quyết vấn đề.
R không có khái niệm về increment operator
(ví dụ ++ trong C). Tuy nhiên, không khó để tự thực hiện một ví dụ:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
Trong trường hợp đó bạn sẽ gọi
x <- 10
inc(x)
Tuy nhiên, nó giới thiệu chức năng gọi qua đầu, vì vậy nó chậm hơn so với x <- x + 1
tự nhập . Nếu tôi không nhầm increment operator
được giới thiệu để làm cho trình biên dịch dễ dàng hơn, vì nó có thể chuyển đổi mã thành các hướng dẫn ngôn ngữ máy đó trực tiếp.
INC
hướng dẫn được giới thiệu trong các bộ xử lý chủ yếu để thực hiện các bộ đếm (xem Hướng dẫn dành cho nhà phát triển phần mềm Intel). Tôi sẽ cập nhật câu trả lời.
R không có các thao tác này vì (hầu hết) các đối tượng trong R là bất biến. Họ không thay đổi. Thông thường, khi có vẻ như bạn đang sửa đổi một đối tượng, bạn thực sự đang sửa đổi một bản sao.
Chúng tôi đã phát hành một gói, người điều hành, để giúp với loại điều này. Bạn có thể đọc thêm về nó ở đây: https://happylittlescripts.blogspot.com/2018/09/make-your-r-code-nicer-with-roperators.html
install.packages('roperators')
require(roperators)
x <- 1:3
x %+=% 1; x
x %-=% 3; x
y <- c('a', 'b', 'c')
y %+=% 'text'; y
y %-=% 'text'; y
# etc
Chúng tôi có thể ghi đè +
. Nếu unary +
được sử dụng và đối số của nó là một +
lệnh gọi unary , sau đó tăng biến có liên quan trong môi trường gọi.
`+` <- function(e1,e2){
# if unary `+`, keep original behavior
if(missing(e2)) {
s_e1 <- substitute(e1)
# if e1 (the argument of unary +) is itself an unary `+` operation
if(length(s_e1) == 2 &&
identical(s_e1[[1]], quote(`+`)) &&
length(s_e1[[2]]) == 1){
# increment value in parent environment
eval.parent(substitute(e1 <- e1 + 1,list(e1 = s_e1[[2]])))
# else unary `+` should just return it's input
} else e1
# if binary `+`, keep original behavior
} else .Primitive("+")(e1,e2)
}
x <- 10
++x
x
# [1] 11
các hoạt động khác không thay đổi:
x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11
Đừng làm điều đó vì bạn sẽ làm chậm mọi thứ. Hoặc thực hiện trong môi trường khác và đảm bảo bạn không có các vòng lặp lớn theo các hướng dẫn này.
Bạn cũng có thể làm điều này:
`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2
Có một cách khác để làm điều này, mà tôi thấy rất dễ dàng, có thể là một số trợ giúp
Tôi sử dụng <<-
cho các tình huống này Các toán tử <<-
gán giá trị cho môi trường cha
inc <- function(x)
{
x <<- x + 1
}
và bạn có thể gọi nó như thế
x <- 0
inc(x)
x += 1
hoặcx++
-x = x + 1
làm việc.