簡體   English   中英

在R中解析“ - >”賦值運算符

[英]Parsing “->” assignment operator in R

我的問題是在R語言中解析表達式。 讓我跳到一個例子中:

fun_text <- c("
0 -> var
f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}

(function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2

f3 = function(x)
{
  0 -> sum_var
  sum_var2 = 0
  sum_var3 <- 0
}

")

fun_tree <- parse(text=fun_text)
fun_tree 
fun_tree[[1]]
fun_tree[[2]]
fun_tree[[3]]
fun_tree[[4]]

之后,我們獲得了這些結果:

expression(0 -> var, f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}, (function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2, f3 = function(x)
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})

var <- 0

f1 <- function() {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
}

f2 <- (function() {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
})

f3 = function(x) {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
}

如您所見,所有“ - >”賦值運算符都更改為“< - ”,但不是第一個示例(僅限“fun_tree”)。 我的問題是:為什么? 我能確定我總是在語法樹中得到“< - ”運算符,所以我不能打擾自己實現“ - >”的情況嗎?

我可以確定我總是在語法樹中得到“< - ”運算符

讓我們來看看 …

> quote(b -> a)
a <- b
> identical(quote(b -> a), quote(a <- b))
[1] TRUE

所以是的, ->賦值總是被解析為<- (在調用時一樣->作為函數名! 1 )。

由於parsekeep.source參數,你的第一個顯示是keep.source

> parse(text = 'b -> a')
expression(b -> a)
> parse(text = 'b -> a', keep.source = FALSE)
expression(a <- b)

1調用<-作為函數與將其用作運算符相同:

> quote(`<-`(a, b))
a <- b
> identical(quote(a <- b), quote(`<-`(a, b)))
[1] TRUE

但是,沒有->函數(雖然你可以定義一個),並且寫b -> a從不調用->函數,它總是被解析為a <- b ,然后調用<-函數或原始。

這稍微偏離主題,但我認為在快速命令行輸入之外的情況下可以使用從左到右的賦值運算符。 所以,這是定義這樣一個運算符的一種方法:

"%op%"<- function(a,b) eval(substitute(b<-a), parent.frame())

我正在使用它來避免在向/從向量存儲/加載一組矩陣和向量時重復R代碼( 錯誤:在R中找不到對象' - >' )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM