2012-07-25 30 views
39

Trợ giúp R ​​giải thích invisible() là "hàm trả về bản sao tạm thời của một đối tượng". Tôi gặp khó khăn khi hiểu những gì invisible() được sử dụng cho. Bạn có thể giải thích những gì invisible() và khi chức năng này có thể hữu ích?Chức năng vô hình() làm gì?

Tôi đã thấy rằng invisible() hầu như luôn được sử dụng trong các hàm phương thức cho print(). Dưới đây là một ví dụ:

### My Method function: 
print.myPrint <- function(x, ...){ 
    print(unlist(x[1:2])) 
    invisible(x) 
} 

x = list(v1 = c(1:5), v2 = c(-1:-5)) 
class(x) = "myPrint" 
print(x) 

Tôi đã suy nghĩ rằng nếu không có invisible(x), tôi sẽ không thể làm nhiệm vụ như:

a = print(x) 

Nhưng nó thực sự không phải vậy. Vì vậy, tôi muốn biết những gì invisible() hiện, nơi nó có thể hữu ích, và cuối cùng những gì vai trò của nó là trong phương pháp in chức năng ở trên?

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

+13

Tôi có thể cung cấp cho bạn câu trả lời nhưng tôi không thể hiển thị câu trả lời cho bạn. – mdsumner

Trả lời

23

Từ ?invisible:

chi tiết:

This function can be useful when it is desired to have functions 
return values which can be assigned, but which do not print when 
they are not assigned. 

Vì vậy, bạn có thể gán kết quả, nhưng nó sẽ không được in nếu không được giao. Nó thường được sử dụng thay cho return. Phương thức print.myPrint của bạn chỉ in vì bạn gọi rõ ràng print. Cuộc gọi đến invisible(x) ở cuối chức năng của bạn chỉ cần trả về một bản sao của x.

Nếu bạn không sử dụng invisible, x cũng sẽ được in nếu không được chỉ định. Ví dụ:

R> print.myPrint <- function(x, ...){ 
+ print(unlist(x[1:2])) 
+ return(x) 
+ } 
R> print(x) 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
    1 2 3 4 5 -1 -2 -3 -4 -5 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
    1 2 3 4 5 -1 -2 -3 -4 -5 
7

Trong khi invisible() làm cho nội dung của nó tạm thời vô hình và thường được sử dụng thay vì return() nó chứ không nên được sử dụng kết hợp với return() và không phải là sự thay thế của nó.

Trong khi return() sẽ ngừng thực hiện chức năng và trả về giá trị được đưa vào đó, invisible() sẽ không làm như vậy. Nó chỉ làm cho nội dung của nó vô hình trong một thời gian.

Hãy xem xét hai ví dụ sau đây:

f1 <- function(x){ 
    if(x > 0){ 
    invisible("bigger than 0") 
    }else{ 
    return("negative number") 
    } 
    "something went wrong" 
} 

result <- f1(1) 

result 
## [1] "something went wrong" 



f2 <- function(x){ 
    if(x > 0){ 
    return(invisible("bigger than 0")) 
    }else{ 
    return("negative number") 
    } 
} 

result <- f2(1) 

result 
## [1] "bigger than 0" 

Sau khi phá vỡ invisible() 's cạm bẫy chúng ta có thể có một cái nhìn tại làm việc của nó:

f2(1) 

Chức năng không in giá trị trả về của nó do sử dụng invisible(). Tuy nhiên nó không vượt qua trên giá trị như thường lệ:

res <- f2(1) 
res 
## [1] "bigger than 0" 

invisible() trường hợp sử dụng 's là ví dụ để ngăn các giá trị trả về hàm sẽ tạo ra trang sau trang của đầu ra hoặc khi hàm được gọi cho hiệu ứng phụ của nó và giá trị trả về là ví dụ:chỉ được sử dụng để cung cấp thêm thông tin ...

+1

Đến từ các ngôn ngữ lập trình khác, nó có ý nghĩa hơn một khi tôi nhận ra rằng R in rất nhiều nội dung ngầm. Tôi sẽ xem xét việc in ấn một tác dụng phụ và vô hình() làm cho nó không làm điều đó. – Chris

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