2016-07-15 18 views
5

Paketim (başka bir paket B) başka bir pakete bağlıdır. B paketimin başarısız olmasına neden olan bir hataya sahip bir B f işlevini değiştirmem gerekiyor. Sorun şu ki, f, izin verilmeyen bir işlevdir. f ihraç edildiBir pakette gönderilmemiş nesne nasıl değiştirilir

, ben R-yardımına this post açıklanan tekniği kullanabilirsiniz: Böyle bir işlev yama istiyorum

birkaç kez, ben kullanın:

unlockBinding(name, env); 
assignInNamespace(name, value, ns=pkgName, envir=env); 
assign(name, value, envir=env); 
lockBinding(name, env); 

Ancak, f gönderilmediği için, bu çalışmaz.

Basit bir örnek sorunu göstermek için:

# rf is an exported function from the stats package; this works 
foo <- function(x) x 
unlockBinding("rf", as.environment("package:stats")) 
assignInNamespace("rf", foo, ns="stats", pos="package:stats") 
assign("rf", bar, pos="package:stats") 
lockBinding("rf", as.environment("package:stats")) 

rf(42) 
# 42  


# C_rf is an unexported object that rf() uses; this fails 
bar <- function(x) x + 1 
unlockBinding("C_rf", as.environment("package:stats")) 
assignInNamespace("C_rf", bar, ns="stats", pos="package:stats") 
assign("C_rf", bar, pos="package:stats") 
lockBinding("C_rf", as.environment("package:stats")) 

# Error in unlockBinding("C_rf", as.environment("package:stats")) : 
# no binding for "C_rf" 

o f değiştirmek mümkün mü?

cevap

2

Göründüğü kadarıyla, yalnızca unlockBinding, assign ve lockBinding çağrılarını kaldırmak zorunda kaldım.

bar <- function(x) x + 1 
assignInNamespace("C_rf", bar, ns="stats", pos="package:stats") 

stats:::C_rf 
# function(x) x + 1 

rf(3, 2, 2) 
#Error in .Call(C_rf, n, df1, df2) : 
# first argument must be a string (of length 1) or native symbol reference 
İlgili konular