sách gpt4 ăn đã đi

Cách chuyển biểu thức tới đối số Bench::mark exprs(Cách chuyển biểu thức tới đối số Bench::mark exprs)

In lại Tác giả: trợ lý lỗi Thời gian cập nhật: 25-10-2023 12:20:24 28 4
mua khóa gpt4 giày nike



Giả sử tôi có một danh sách chứa các hàm:

Giả sử tôi có một danh sách chứa các hàm:


hàm <- danh sách(
vòng lặp = hàm(n) {
kết quả <- 0
đối với (i trong seq_len(n)) {
kết quả <- kết quả + i
}
kết quả
},
vect = hàm(n) tổng(seq_len(n))
)

Nếu tôi muốn đánh giá chúng bằng cách sử dụng ghế dài Tôi có thể làm điều này:

Nếu tôi muốn đánh giá chúng bằng BASCH, tôi có thể làm điều này:


Số <- 1e6
bench::mark(funcs$loop(N), funcs$vect(N)) # Được

cách này hiệu quả. Tuy nhiên, tôi có hai điểm trừ nhỏ với cách tiếp cận này.

Nó hoạt động rất tốt. Tuy nhiên, tôi có hai vấn đề nhỏ với cách tiếp cận này.



  1. Tôi cần nhớ viết một biểu thức cho mỗi hàm. Ví dụ, nếu tôi thêm một hàm vào vui vẻ Tôi cần nhớ thêm nó như một biểu thức vào đánh dấu(...).

  2. Tôi cũng đang lặp lại việc đánh giá chức năng (tức là, (N) được lặp lại nhiều lần). Rõ ràng là điều này rất tầm thường, nhưng dù sao thì đây cũng là một hình thức lặp lại.


Có vẻ như là biểu thức lập luận cho đánh dấu sẽ giúp ích bằng cách cho phép tôi làm điều gì đó như:

Có vẻ như lập luận của Exprs to Mark sẽ hữu ích vì nó cho phép tôi làm điều gì đó như:


bench::mark(exprs = lapply(funcs, \(f) expression(f(1e6)))) # Lỗi trong f(1e+06): không tìm thấy hàm "f"

Tuy nhiên, nó tạo ra lỗi. Làm thế nào tôi có thể tạo ra một danh sách phù hợp để chuyển đến biểu thức lý lẽ?

Tuy nhiên, nó tạo ra một lỗi. Làm cách nào tôi có thể tạo danh sách phù hợp để chuyển đến tham số exprs?


Thêm câu trả lời

Bạn có thể sử dụng trích dẫn() hoặc thay thế() thay vì sự biểu lộ(). Dù bằng cách nào thì bạn cũng cần phải thông báo cho hàm để bỏ dấu ngoặc kép.

Bạn có thể sử dụng BQUOTE() hoặc SUBSITE() thay vì biểu thức(). Cho dù bạn thực hiện phương pháp nào, bạn cần phải cho hàm biết để hủy đăng ký hàm.

trích dẫn dẫn đến cùng một lỗi, trong khi thay thế dẫn đến thông báo lỗi "Lỗi trong eval(e, env): không tìm thấy đối tượng 'X'". Tôi nghi ngờ là tôi không hiểu câu thứ hai của bạn (tức là, nơi bạn đề cập đến việc bỏ dấu ngoặc kép).

BQUOTE dẫn đến lỗi tương tự, trong khi thay thế dẫn đến thông báo lỗi "ERROR in val(e,env): Không tìm thấy đối tượng 'X'". Tôi nghĩ tôi không hiểu câu thứ hai của bạn (tức là câu trích dẫn bạn đã đề cập).

Thì ra là bench::mark(biểu thức = lapply(hàm, \(f) { g <- f; thay thế(g(1e6)) })) hoạt động. Rõ ràng là nó có liên quan đến cách một biến được nắm bắt (tôi đã thấy một vấn đề tương tự trong C# khi đóng một biến vòng lặp). Tuy nhiên, tôi không thể nói rằng tôi hiểu đầy đủ vấn đề. Ít nhất thì đó cũng là một giải pháp!

Kết quả chứng minh rằng BASE::MARK(exprs=lapp(uncs,\(F){g<-f; subite(g(1e6))})) là hợp lệ. Vì vậy, rõ ràng điều này có liên quan đến cách nắm bắt biến (Tôi đã thấy một vấn đề tương tự trong C# khi kết thúc một biến vòng lặp). Tuy nhiên, tôi không thể nói rằng tôi hoàn toàn hiểu được vấn đề. Ít nhất đây là một giải pháp!

Khuyến nghị câu trả lời tuyệt vời

Thay vì sử dụng sự biểu lộ() người ta cần phải sử dụng thay thế() (như Konrad Rudolph chỉ ra). Tuy nhiên, như đã viết ban đầu, nó nắm bắt tham số sai; việc gán lại cho một biến tạm thời sẽ khắc phục được điều này. Do đó, đoạn mã sau hoạt động.

Thay vì sử dụng biểu thức() chúng ta cần sử dụng sidiute() (như Konrad Rudolf đã chỉ ra). Tuy nhiên, như được viết ban đầu, nó bắt được các đối số sai; việc gán lại cho một biến tạm thời sẽ khắc phục được điều này. Vì vậy, đoạn mã sau hoạt động tốt.


bench::mark(biểu thức = lapply(hàm, \(f) {
g <-f
thay thế(g(1e6))
}))

Thêm câu trả lời
28 4 0
trợ lý lỗi
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress