Использование глобальных переменных в качестве входных данных для функции R - PullRequest
1 голос
/ 05 августа 2020

Существует множество примеров обновления глобальных переменных изнутри функций R с использованием <<- или assign() ( здесь - всего лишь один пример), но я не могу найти никаких примеров на как использовать такие переменные в качестве входных данных для функций. Например, рассмотрим эту функцию MATLAB, которая представляет собой просто сложный способ добавления пи к числу:

function final = parentFun(why)
    global pie
    pie = pi;
    final = childFun(why);
end

function y = childFun(x)
    global pie
    y = x + pie;
end

Так что

>> parentFun(100)

ans =

  103.1416

Я хотел бы воссоздать это в R . Самое близкое, что я получил, было вложением childFun в parentFun, например:

parentFun <- function(why) {
    pie <- pi
    childFun <- function(x) {
        x + pie
    }
    childFun(why)
}

И действительно

> parentFun(100)
[1] 103.1416

Проблема в том, что в моем реальном случае parentFun является пара сотен строк и несколько дочерних элементов, которые могут быть столь же длинными. Другими словами, вложение в основном не входит в таблицу .

Кроме того, это функции в пакете, поэтому pie на самом деле получается из функции и не запускается сценарий.

Конечно, разделение обеих функций не работает, потому что childFun() не видит pie:

> parentFun <- function(why) {
        pie <- pi
        childFun(why)
}
> childFun <- function(x) {
        x + pie
}
> parentFun(100)
Error in x + pie : non-numeric argument to binary operator

1 Ответ

2 голосов
/ 05 августа 2020

Одна из возможностей - изменить окружение childfun

childFun <- function(x) {
        x + pie
}

parentFun <- function(why) {
        pie <- pi
        environment(childFun) <- environment()
        childFun(why)
}

parentFun(100)
[1] 103.1416

Это связано с лексической областью видимости R. Когда вы вызываете функцию, R сначала ищет переменные внутри функционального окружения. Если это не удается, R продолжает поиск в родительских средах (в вашем случае - в глобальной среде).

Написав environment(childFun) <- environment(), вы указываете функции искать переменные в среде parentFun.

Я рекомендую эту книгу , если вы хотите узнать больше об окружающей среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...