Câu trả lời đơn giản là bạn không thể và không nên cố gắng. Điều đó phá vỡ phạm vi và có thể tàn phá nếu nó được cho phép. Có một vài tùy chọn mà bạn có thể suy nghĩ về vấn đề khác nhau.
đầu tiên vượt qua y như một hàm
foo<-function(x,y=min){
m<-1:10
x+y(m)
}
nếu một chức năng đơn giản không hoạt động, bạn có thể di chuyển m đến một cuộc tranh cãi với một mặc định.
foo<-function(x,y=min(m),m=1:10){
x+y(m)
}
Vì đây là ví dụ về đồ chơi, tôi cho rằng điều này quá tầm thường. Nếu bạn nhấn mạnh vào phạm vi vi phạm sau đó bạn có thể vượt qua nó như là một biểu thức được đánh giá một cách rõ ràng.
foo<-function(x,y=expression(min(m))){
m<-1:10
x+eval(y)
}
Sau đó, có tùy chọn trả về một hàm từ một hàm khác. Và điều đó có thể phù hợp với bạn, tùy thuộc vào mục đích của bạn.
bar<-function(f)function(x,y=f(m)){
m<-1:10
x+y
}
foo.min<-bar(min)
foo.min(1) #2
foo.max<-bar(max)
foo.max(1) #10
Nhưng bây giờ chúng tôi đang bắt đầu nhận được vào vô lý.
Nguồn
2009-11-04 04:52:18
"đánh giá lười chỉ hoạt động cho đối số mặc định", bạn có chắc chắn về điều đó không? IIUC lười biếng đánh giá xảy ra với tất cả các đối số chức năng. Lý do ví dụ của bạn không hoạt động là vì m không nằm trong phạm vi của người gọi. –