Сделайте пользовательскую функцию в R

Извините, если об этом спрашивали раньше, но я не могу найти ответа.

Скажем, я пишу небольшую функцию на R

add2<-function(a){
return(a+2)
}

Я сохраняю его как add2.R в моем домашнем каталоге (или в любом другом каталоге). Как мне заставить R найти его?

> add2(4)
Error: could not find function "add2"

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


person stuppie    schedule 18.01.2013    source источник
comment
вы можете source вещи в своем .Rprofile, если вам всегда нужна функция, или поместить ее в пакет и использовать library.   -  person Justin    schedule 18.01.2013
comment
Чтобы немного расширить комментарий Джастина, документация по адресу ?Startup немного сложна для чтения, но она содержит основы того, как использовать файл .RProfile. Обычно он ищется в текущем каталоге или в домашнем каталоге пользователя (именно в таком порядке). Файл профиля пользователя загружен в рабочую область ..   -  person joran    schedule 18.01.2013
comment
Windows 7 не позволяет мне создавать файл с именем .Rprofile. Какие-либо предложения?   -  person stuppie    schedule 18.01.2013
comment
Ну я сделал это в командной строке .. переместите g.Rprofile .Rprofile тупые окна ......   -  person stuppie    schedule 18.01.2013
comment
Кроме того, из R вы можете делать file.create(".Rprofile") --- даже в Windows =).   -  person Josh O'Brien    schedule 19.01.2013
comment
Сохраните функцию, используя save(add2, file = "add2.RData"), затем загрузите ее, когда потребуется load("add2.RData")   -  person Seanosapien    schedule 30.10.2018


Ответы (3)


Один легкий вариант:

dump("add2", file="myFunction.R")

## Then in a subsequent R session
source("myFunction.R")

Альтернатива:

save("add2", file="myFunction.Rdata")

## Then just double click on "myFunction.Rdata" to open  
## an R session with add2() already in it 

## You can also import the function to any other R session with
load("myFunction.Rdata")

Пока вы не будете готовы упаковать функции в свой собственный частный пакет, хранение их в хорошо организованных, source()-готовых текстовых файлах (как в первом примере выше), вероятно, является лучшей стратегией. См. этот высоко оцененный вопрос SO для некоторых примеров того, насколько опытен Пользователи используют этот подход на практике.

person Josh O'Brien    schedule 18.01.2013

Перед вызовом функции (например, в начале скрипта) вы должны source файл, содержащий вашу пользовательскую функцию / функции, то есть:

source("add2.R") # this executes add2.R script loading add2 function

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

person digEmAll    schedule 18.01.2013

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

/Library/Frameworks/R.framework/Versions/2.15/Resources/etc/ - это (для Mac) расположение Rprofile.site, которое необходимо соответствующим образом отредактировать.

Моя версия:

.First <- function()
{ 
    dir='~/Desktop/Infobase/R/0_init/0_init.R'
    if(file.exists(dir))
    {
    source(dir, chdir = TRUE) 
    } else {cat("startup file is not found at:",dir)}
    cat("\nWelcome at", date(), "\n")
}    

.Last <- function()
{ 
cat("\nGoodbye at ", date(), "\n")
}

Обратите внимание, что после того, как вы получили 1 сценарий R, вам больше не нужно вводить этот файл. Просто сделайте все, что вам нужно, из файла, который вы получили. В моем случае файл "0_init.R" не содержит функций, он просто содержит загрузку других скриптов. Что ж, идея у вас есть.

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

используйте «прикрепить», «отсоединить», «поиск» и т. д.

attach(FUN,name="af2tr")
person dgrigonis    schedule 18.01.2013