R сила локальная сфера - PullRequest
36 голосов
/ 02 июня 2011

Возможно, это неправильная терминология, но, надеюсь, я смогу донести свою точку зрения.

Я часто заканчиваю тем, что делаю что-то вроде:

myVar = 1
f <- function(myvar) { return(myVar); }
# f(2) = 1 now

R с радостью использует переменную внеобласть действия функции, которая заставляет меня чесать голову, размышляя о том, как я мог бы получить результаты, которые у меня есть.

Есть ли какая-либо опция, которая говорит: «заставить меня использовать только переменные, которым ранее были присвоены значения в этой функции?объем"?Например, Perl use strict делает нечто подобное.Но я не знаю, что R имеет эквивалент my.


РЕДАКТИРОВАТЬ: Спасибо, я знаю, что я их прописными буквами по-разному.Действительно, пример был создан специально для иллюстрации этой проблемы!

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

РЕДАКТИРОВАТЬ 2: Кроме того, еслиRkward или другая IDE предлагает эту функциональность, я бы тоже хотел это знать.

Ответы [ 11 ]

1 голос
/ 30 января 2013

Что работает для меня, основываясь на ответе @ c-urchin, так это определить скрипт, который читает все мои функции и затем исключает глобальную среду:

filenames <- Sys.glob('fun/*.R')
for (filename in filenames) {
    source(filename, local=T)
    funname <- sub('^fun/(.*).R$', "\\1", filename)
    eval(parse(text=paste('environment(',funname,') <- parent.env(globalenv())',sep='')))
}

Я предполагаю, что

  • все функции и ничего больше содержатся в относительном каталоге ./fun и
  • каждый .R файл содержит ровно одну функцию с именем, идентичным имени файла.

Загвоздка в том, что если одна из моих функций вызывает другую из моих функций, то внешняя функция должна сначала вызвать этот скрипт, и его необходимо вызывать с помощью local=T:

source('readfun.R', local=T)

при условии, конечно, что файл сценария называется readfun.R.

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