2013-05-01 16 views
7

tôi đã cố gắng để sửa đổi và xác định lại một chức năng (xcmsRaw) trong xcms gói R bằng cách đầu tiên xác định một hàmĐịnh nghĩa lại một hàm trong một gói phần mềm R

my.xcmsRaw <- function(filename, profstep = 1, profmethod = "bin", 
        profparam = list(mzcorrf=1), # PATCH - mzcorrf is the m/z correction factor, e.g. 0.99888 for long-chain hydrocarbons 
        includeMSn = FALSE, mslevel=NULL, 
        scanrange=NULL) { ... } 

và sau đó gõ

unlockBinding("xcmsRaw", as.environment("package:xcms")) 
assign("xcmsRaw", my.xcmsRaw, as.environment("package:xcms")) 
lockBinding("xcmsRaw", as.environment("package:xcms")) 

Tuy nhiên, khi Tôi chạy nó cung cấp cho tôi lỗi

Error in get(as.character(FUN), mode = "function", envir = envir) : 
    object 'profBinM' of mode 'function' was not found 

gây ra bởi nó không tìm thấy hàm profBinM, mà là một mã C không đúng ion được định nghĩa trong tập tin xcms.c của gói xcms.

Bất kỳ suy nghĩ nào về cách tôi có thể giải quyết vấn đề này? (Tôi đang làm việc trong môi trường Windows 7, sử dụng R phiên bản 3.0.0)

+0

Bạn đã thử 'assignInNamespace()', như trong ví dụ, [ví dụ này] (http://stackoverflow.com/questions/15505607/diagonal-labels-orientation- on-x-axis-in-heatmaps/15506652 # 15506652)? Trong trường hợp của bạn, bạn sẽ sử dụng một cái gì đó như 'assignInNamespace (x =" xcmsRaw ", giá trị =" my.xcmsRaw ", ns = asNamespace (" xcms "))'. –

+0

Cảm ơn bạn đã gợi ý, chỉ cần thử điều đó nhưng nó vẫn mang lại cho tôi lỗi tương tự ... –

+0

Thú vị. Chỉ cần chính xác/rõ ràng, 'profBinM()' là một hàm R kết thúc tốt đẹp một hàm C. –

Trả lời

5

Cảm ơn Josh - trong trường hợp của tôi, tôi đã nhận nó làm việc bây giờ thông qua

modifline='if ((profparam$mzcorrf!=1)&length(unique(rawdata$mz - trunc(rawdata$mz)))!=1) {rawdata$mz=rawdata$mz*profparam$mzcorrf} else if (profparam$mzcorrf!=1) {print("Exact masses were already rounded to nominal masses");profparam$mzcorrf=1}' 
insertatline=6 
trace(xcmsRaw, tracer=modifline,at=c(insertatline)) 

nơi tôi tìm thấy dòng đúng để chèn mã sửa đổi của tôi sử dụng

as.list(body(xcmsRaw)) 

Để ngăn chặn đầu ra của dấu vết sau đó tôi định nghĩa một hàm thứ hai

xcmsRaw2=function(...) {sink("NUL");obj=xcmsRaw(...);sink();return(obj) } 

mà có thể được gọi và không cung cấp bất kỳ đầu ra truy tìm không cần thiết nào.

Mặc dù vậy vẫn có thể làm cho nó hoạt động thông qua assignInNamespace(), vì điều đó sẽ cho phép chỉnh sửa/định nghĩa lại rộng hơn và cũng cho các thay đổi trong đối số chức năng (đó là lý do phổ biến để xác định lại chức năng) , để có thêm một số đối số) ...

+0

Tuyệt vời! Tôi đồng ý, điều này cảm thấy giống như một hack, nhưng prob của nó. tốt hơn rất nhiều so với không có gì cho đến khi bạn nhấn vào một giải pháp linh hoạt/thanh lịch hơn. –

+0

Đúng vậy - cảm ơn lần nữa vì đã dành thời gian và giúp đỡ của bạn! –

+0

Oh có, và có cách nào thực sự để ngăn chặn đầu ra của dấu vết? Bây giờ mỗi lần tôi gọi xcmsRaw nó sẽ in "Truy tìm xcmsRaw (tệp [samplenr], profstep = profst, profmethod =" bin ", .... bước 6" - nhưng tôi muốn chặn kết quả này. Có cách nào để Hãy làm điều này? –