當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R with 評估數據環境中的表達式


R語言 with 位於 base 包(package)。

說明

評估一個R在由數據構建的環境中的表達式,可能會修改原始數據(的副本)。

用法

with(data, expr, ...)
within(data, expr, ...)
## S3 method for class 'list'
within(data, expr, keepAttrs = TRUE, ...)

參數

data

用於構建環境的數據。對於默認的 with 方法,這可以是環境、列表、數據幀或整數,如 sys.call 中所示。對於 within ,它可以是列表或 DataFrame 。

expr

要評估的表達式;特別是對於 within() 通常是 “compound” 表達式,即形式

   {
     a <- somefun()
     b <- otherfun()
     .....
     rm(unused1, temp)
   }
keepAttrs

對於 within()list 方法, logical 指定結果列表是否應保留 data 中的 attributes 並使其 names 保持相同的順序。通常這是不需要的,因為無論如何結果都是一個命名列表,然後 keepAttrs = FALSE 更有效。

...

要傳遞給(未來)方法的參數。

細節

with 是一個通用函數,它在由 data 構造的本地環境中計算 expr 。該環境以調用者的環境作為其父環境。這對於簡化對建模函數的調用很有用。 (注意:如果 data 已經是一個環境,那麽它將與其現有的父環境一起使用。)

請注意,expr 中的分配發生在構建的環境中,而不是在用戶的工作空間中。

within 類似,隻是它在評估 expr 後檢查環境並對 data 的副本進行相應的修改(如果創建的對象無法存儲在數據幀中,則在數據幀情況下這可能會失敗) DataFrame ),並返回它。 within 可以用作 transform 的替代品。

對於 with ,評估的值 expr 。對於 within ,修改後的對象。

注意

對於交互式使用,這是非常有效且易於閱讀的。然而,對於編程,即在一個函數中,需要更加小心,通常應避免使用 with() ,因為例如 data 中的變量可能會意外覆蓋局部變量,請參閱引用。

此外,當使用帶有顯式 data 參數的建模或圖形函數(通常使用 formula )時,通常首選使用該函數的 data 參數,而不是使用 with(data, ...)

例子

with(mtcars, mpg[cyl == 8  &  disp > 350])
    # is the same as, but nicer than
mtcars$mpg[mtcars$cyl == 8  &  mtcars$disp > 350]

require(stats); require(graphics)

# examples from glm:
with(data.frame(u = c(5,10,15,20,30,40,60,80,100),
                lot1 = c(118,58,42,35,27,25,21,19,18),
                lot2 = c(69,35,26,21,18,16,13,12,12)),
    list(summary(glm(lot1 ~ log(u), family = Gamma)),
         summary(glm(lot2 ~ log(u), family = Gamma))))

aq <- within(airquality, {     # Notice that multiple vars can be changed
    lOzone <- log(Ozone)
    Month <- factor(month.abb[Month])
    cTemp <- round((Temp - 32) * 5/9, 1) # From Fahrenheit to Celsius
    S.cT <- Solar.R / cTemp  # using the newly created variable
    rm(Day, Temp)
})
head(aq)




# example from boxplot:
with(ToothGrowth, {
    boxplot(len ~ dose, boxwex = 0.25, at = 1:3 - 0.2,
            subset = (supp == "VC"), col = "yellow",
            main = "Guinea Pigs' Tooth Growth",
            xlab = "Vitamin C dose mg",
            ylab = "tooth length", ylim = c(0, 35))
    boxplot(len ~ dose, add = TRUE, boxwex = 0.25, at = 1:3 + 0.2,
            subset = supp == "OJ", col = "orange")
    legend(2, 9, c("Ascorbic acid", "Orange juice"),
           fill = c("yellow", "orange"))
})

# alternate form that avoids subset argument:
with(subset(ToothGrowth, supp == "VC"),
     boxplot(len ~ dose, boxwex = 0.25, at = 1:3 - 0.2,
             col = "yellow", main = "Guinea Pigs' Tooth Growth",
             xlab = "Vitamin C dose mg",
             ylab = "tooth length", ylim = c(0, 35)))
with(subset(ToothGrowth,  supp == "OJ"),
     boxplot(len ~ dose, add = TRUE, boxwex = 0.25, at = 1:3 + 0.2,
             col = "orange"))
legend(2, 9, c("Ascorbic acid", "Orange juice"),
       fill = c("yellow", "orange"))

參考

Thomas Lumley (2003) Standard nonstandard evaluation rules. https://developer.r-project.org/nonstandard-eval.pdf

也可以看看

evalqattachassigntransform

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Evaluate an Expression in a Data Environment。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。