2016-07-15 155 views
5

Il mio pacchetto (chiamiamolo A) dipende da un altro pacchetto B. Ho bisogno di modificare una funzione f in B che presenta un errore che causa il fallimento del mio pacchetto. Il problema è che f è una funzione non esportata.Come modificare un oggetto non esposto in un pacchetto

Se f è stato esportato, ho potuto utilizzare la tecnica descritta in this post a R-help:

Le poche volte che voglio rattoppare una funzione come questa, io uso:

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

Ma poiché f non è stato esportato, questo non funziona.

semplice esempio per illustrare il problema:

# 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" 

E 'possibile modificare f?

risposta

2

Come risulta, ho dovuto solo rimuovere le chiamate unlockBinding, assign e lockBinding.

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