методы поиска проблем для универсальной функции - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь работать с исходным кодом для sjmisc::count_na.Я не очень опытен в копании исходного кода, поэтому я использовал этот поток в качестве руководства, но я все еще застреваю.Я надеюсь, что это не дубликат.

В RStudio я могу нажать F2 на count_na, чтобы получить его источник, но похоже, что некоторая работа выполняется в функции под названием get_label.Исходный код этой функции просто

function (x, ..., def.value = NULL, case = NULL) 
{
  UseMethod("get_label")
}

В приведенном выше потоке предлагается попробовать methods() или getAnywhere

library(sjmisc)

methods("get_label")
#> Error in .S3methods(generic.function, class, parent.frame()): no function 'get_label' is visible

getAnywhere("get_label")
#> A single object matching 'get_label' was found
#> It was found in the following places
#>   namespace:sjlabelled
#> with value
#> 
#> function (x, ..., def.value = NULL, case = NULL) 
#> {
#>     UseMethod("get_label")
#> }
#> <bytecode: 0x000000001a7522c0>
#> <environment: namespace:sjlabelled>

. Это дает понять, что get_label() является функцией вsjlabelled пространство имен.Я не уверен, как поступить, чтобы найти его исходный код.Исходя из приведенного выше потока, я понимаю, что сначала мне нужно выяснить, для каких классов написано get_label, а затем я могу посмотреть исходный код методов, специфичных для класса.Для некоторых функций я смог сделать это с помощью выпадающего меню внутри RStudio после использования F2, но здесь такого меню нет.Я также попробовал:

methods("sjlabelled::get_label")
#> Error in .S3methods(generic.function, class, parent.frame()): no function 'sjlabelled::get_label' is visible

methods("sjlabelled:::get_label")
#> Error in .S3methods(generic.function, class, parent.frame()): no function 'sjlabelled:::get_label' is visible

showMethods("sjlabelled::get_label")
#> 
#> Function "sjlabelled::get_label":
#>  <not an S4 generic function>

Что здесь происходит?Что мне нужно сделать, чтобы найти исходный код get_label?

1 Ответ

0 голосов
/ 01 февраля 2019

Попробуйте это: вы можете изменить аргумент класса на ваш предпочтительный в getS3method("get_label","data.frame").Доступные классы найдены в результате methods("get_label")

library(sjlabelled)
library(sjmisc)
methods("get_label")

getS3method("get_label","data.frame")

function (x, ..., def.value = NULL, case = NULL) 
{
    x <- get_dot_data(x, dplyr::quos(...))
    sapply(seq_along(x), function(i) {
        label <- attr(x[[i]], "label", exact = T)
        if (is.null(label)) {
            if (!is.null(def.value)) {
                if (i <= length(def.value)) 
                  label <- def.value[i]
                else label <- def.value
            }
            else {
                label <- ""
            }
        }
        names(label) <- colnames(x)[i]
        convert_case(label, case)
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...