Как изменить неэкспортированный объект в пакете

Мой пакет (назовем его A) зависит от другого пакета B. Мне нужно изменить функциюf в B есть ошибка, которая приводит к сбою моего пакета. Проблема в том, чтоf это неизвестная функция.

Еслиf был экспортирован, я мог бы использовать методику, описанную вэта почта R-помочь:

Несколько раз, когда я хочу исправить такую ​​функцию, я использую:

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

Но потому чтоf не экспортируется, это не работает.

Простой пример для иллюстрации проблемы:

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

Можно ли изменитьf?

Ответы на вопрос(1)

Решение Вопроса

Как оказалось, мне нужно было только удалитьunlockBinding, assign а также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
 Nicholas Hamilton15 июл. 2018 г., 06:08
Это может решить вашу проблему, но я сомневаюсь, что ваш пакет будет принят CRAN, если вы собираетесь опубликовать.

Ваш ответ на вопрос