2016-11-24 19 views
7

Tôi đang đọc Advanced R của Hadley Wickham, nơi một số bài tập rất hay được cung cấp. Một trong số họ yêu cầu mô tả chức năng này:Hiểu đánh giá các đối số đầu vào của các hàm

f1 <- function(x = {y <- 1; 2}, y = 0) { 
    x + y 
} 
f1() 

Ai đó có thể giúp tôi hiểu tại sao nó trả về 3? Tôi biết có cái gì đó được gọi là đánh giá lười biếng của các đối số đầu vào, và ví dụ: bài tập khác yêu cầu mô tả chức năng này

f2 <- function(x = z) { 
    z <- 100 
    x 
} 
f2() 

và tôi đã dự đoán chính xác là 100; x nhận giá trị z được đánh giá bên trong hàm và sau đó x được trả về. Tuy nhiên, tôi không thể hiểu được điều gì sẽ xảy ra trong f1().

Cảm ơn.

+2

Câu trả lời thực sự là, bất cứ ai viết mã như thế này sẽ bị buộc phải xem 24 giờ của video Donald Trump, hoặc cho đến khi mắt của họ tan chảy, tùy theo điều kiện nào đến trước. –

+0

Nó không phải là một phần của bất kỳ mã nào nhưng tập thể dục :) – Celdor

Trả lời

7

Xem này từ https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Evaluation:

Khi một hàm được gọi hoặc gọi một khung đánh giá mới là tạo. Trong khung này, các đối số chính thức được kết hợp với các đối số được cung cấp trong các đối số được cung cấp trong đối số được đối sánh trong đối số . Các câu lệnh trong phần thân của hàm được đánh giá tuần tự trong khung môi trường này. ... R có hình thức đánh giá lười biếng đối số chức năng. Các đối số không được đánh giá cho đến khi cần thiết.

và điều này từ https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Arguments:

Giá trị mặc định cho các đối số có thể được xác định bằng cách sử dụng hình thức đặc biệt ‘name = biểu’. Trong trường hợp này, nếu người dùng không chỉ định giá trị cho đối số khi hàm được gọi biểu thức sẽ được liên kết với biểu tượng tương ứng. Khi giá trị là cần biểu thức được đánh giá trong khung đánh giá của hàm .

Tóm lại, nếu tham số không có giá trị do người dùng chỉ định, giá trị mặc định của nó sẽ được đánh giá trong khung đánh giá của hàm. Vì vậy, y không được đánh giá lúc đầu. Khi mặc định của x được đánh giá trong khung đánh giá của hàm, y sẽ được sửa đổi thành 1, sau đó x sẽ được đặt thành 2. Khi y đã được tìm thấy, đối số mặc định không có thay đổi để được đánh giá. nếu bạn thử f1(y = 1)f1(y = 2), kết quả vẫn là 3.

+4

Ngoài ra, tôi đoán, đáng nói là 'y + x' thay vì' x + y' trả về các giá trị khác nhau (trong phần 'f1') –

+0

. Ty :) – Celdor

Các vấn đề liên quan