Это немного похоже на ответ fab, но не совсем то же самое.
Контракт singleton не требует, чтобы мы могли вызвать конструктор несколько раз. Поскольку одноэлемент должен создаваться один раз и один раз, разве это не должно быть создано только один раз? «Spoofing» конструктор, возможно, ухудшает удобочитаемость.
Итак, мое предложение таково:
class Elvis():
def __init__(self):
if hasattr(self.__class__, 'instance'):
raise Exception()
self.__class__.instance = self
# initialisation code...
@staticmethod
def the():
if hasattr(Elvis, 'instance'):
return Elvis.instance
return Elvis()
Это не исключает использования конструктора или поля instance
код пользователя:
if Elvis() is King.instance:
... если вы точно знаете, что Elvis
еще не создано и что King
имеет.
Но он рекомендует пользователям использовать универсальный метод the
:
Elvis.the().leave(Building.the())
Чтобы сделать это, вы также можете переопределить __delattr__()
, чтобы поднять исключение, если попытка удалить instance
, и переопределить __del__()
, чтобы он вызывал исключение (если мы не знаем, что программа заканчивается ...)
Спасибо тем, кто помог с комментариями и изменениями, из которых больше приветствуются. Хотя я использую Jython, это должно работать в более общем плане и быть потокобезопасным.
try:
# This is jython-specific
from synchronize import make_synchronized
except ImportError:
# This should work across different python implementations
def make_synchronized(func):
import threading
func.__lock__ = threading.Lock()
def synced_func(*args, **kws):
with func.__lock__:
return func(*args, **kws)
return synced_func
class Elvis(object): # NB must be subclass of object to use __new__
instance = None
@classmethod
@make_synchronized
def __new__(cls, *args, **kwargs):
if cls.instance is not None:
raise Exception()
cls.instance = object.__new__(cls, *args, **kwargs)
return cls.instance
def __init__(self):
pass
# initialisation code...
@classmethod
@make_synchronized
def the(cls):
if cls.instance is not None:
return cls.instance
return cls()
Оповещения:
__new__
__new__
вы должны украсить с помощью @classmethod, или __new__
будет методом несвязанного экземпляра the
класса, возможно, переименовать его в instance
Теперь я нашел документацию:
Это документация, которая объясняет, как создавать пакеты R, доступные только в репозитории CRAN: https://www.continuum.io/ content / conda-data-science
Перейдите в раздел «Построение пакета conda R».
(Подсказка: если пакет R доступен под анакондой .org используйте этот ресурс. См. здесь: https://www.continuum.io/blog/developer/jupyter-and-conda-r )
alistaire - это еще одна возможность добавить R-пакеты:
Если вы устанавливаете пакеты изнутри R через регулярные install.packages
(из зеркал CRAN) или devtools::install_github
(из GitHub) они отлично работают. @alistaire
Как это сделать: откройте свою независимую установку R, затем выполните следующую команду:
install.packages("png", "/home/user/anaconda3/lib/R/library")
, чтобы добавить новый пакет в правильную библиотеку R, используемую Jupyter , иначе пакет будет установлен в /home/user/R/i686-pc-linux-gnu-library/3.2/png/libs, упомянутом в .libPaths () .
Добавьте сюда, чтобы другие новички, уже работающие с ноутбуками Jupyter с Python и заинтересованные в использовании его с R: дополнительные пакеты, доступные для Anaconda, можно установить через терминал, используя ту же команду, что и для установки необходимых пакетов.
Установить r-essentials
conda install -c r r-essentials
Установить микрообъект (инфраструктура для точного измерения и сравнения времени выполнения R-выражений)
conda install -c r r-microbenchmark
Я попытался установить R-пакеты ggplot2, tidyverse и т. д., используя стандартные репозитории CRAN в командной строке, и столкнулся с несколькими проблемами и проблемами.
Все, от неиспользуемых файлов «init.tcl» до строки из 15 символов ошибки. Я смог подробно ознакомиться с сайтом Conda и WWW.Anaconda.org. Это установленные R-пакеты в архитектуре каталога Anaconda, которые исполнялись в R в терминальной среде RStudio и R в Jupyter Notebooks Anaconda Navigator.
например: conda install -c r r-tidyverse
Очень легко и работает в первый раз. [На Kubuntu 17.04 с Anaconda Navigator 1.6.2; R версии 3.3.2 (2016-10-31)]
Я нашел легкое обходное решение. Я полагаю, что у вас есть RStudio IDE для вас. Странно использовать RStudio для этого, но я пробовал прямо с R в моем терминале, и это не сработало. Итак, в консоли RStudio просто добавьте путь к вашему каталогу anaconda (в OSX, '/ Users / yourusernamehere / anaconda / lib / R / library')
Итак, например,
install.packages('package','/Users/yourusernamehere/anaconda/lib/R/library')
Мне стыдно выкладывать такой нелюдимый ответ, но это единственный, который работал для меня.
Чтобы установить другие R-пакеты на Jupyter за R-essentials
install.packages('readr', repos='http://cran.us.r-project.org')
Одна из проблем заключается в том, что конкретным репозиторием является US.R-Project
(как показано ниже). Я пробовал другие, и это не сработало.
N.B. Замените readr
любым желаемым именем пакета для установки.
Установите rpy2 с помощью conda и добавьте следующую строку в ваш ноутбук Jupyter.
%load_ext rpy2.ipython
В следующих фрагментах вы можете просто запустить любой r-код, указав% R
Ниже мой любимый метод установки и / или загрузки r package
%R if (!require("pacman")) install.packages("pacman")
%R pacman::p_load(dplyr, data.table, package3, package4)
аргумент p_load будет устанавливать + загружать пакет, если он не находится в вашем lib else, он просто загрузит его.
Кто-то предложил не очень элегантный способ, но то, что элегантно, пока оно работает.
install.packages ('package', '/ Users / yourusernamehere / anaconda / lib / R / library ')
Я провел почти все утро, пытаясь найти ответ на эту проблему. Я смог установить библиотеки на RStudio, но не на Jupyter Notebook (у них разные версии R). Это решение «почти» работало, просто я обнаружил, что Jupyter Notebook пытается установить его в другой каталог, и он будет сообщите, какой каталог. Поэтому я только изменил это, и это сработало как прелесть ... благодаря Dninhos
У меня возникла проблема при попытке установить пакет из github, используя install_github("user/package")
в conda с r-essentials. Ошибки были множественными и не описательными.
Удалось решить проблему, используя следующие этапы:
library(devtools)
install('/path/to/unzipped-package')
install.packages('missing-package', repos='http://cran.us.r-project.org')
для всех зависимостей install('/path/to/unzipped-package')
. Теперь он должен работать! Вот конда-ориентированный ответ. Он основывается на ответе Фрэнка и веб-сайте континуума: https://www.continuum.io/content/conda-data-science с чуть более подробной информацией.
Некоторые пакеты не доступные в r-essentials, по-прежнему доступны на каналах conda, в этом случае это просто:
conda config --add channels r
conda install r-readxl
Если вам нужно построить пакет и установить с помощью conda:
conda skeleton cran r-xgboost
conda build r-xgboost
conda install --use-local r-xgboost
, что последняя строка отсутствует на веб-сайте континуума, поскольку они предполагают, что она сначала публикуется в репозитории anaconda. Без него ничего не будет помещено в каталог envs /, и пакет не будет доступен для командной строки R или Jupyter.
На маке мне было очень важно установить компилятор Clang для сборки пакетов:
conda install clangxx_oxs-64
conda build r-xgboost
. & quot; make: / home / user / anaconda3 / conda-bld / r-matrixstats_1516727877269 / _h_env_placehold_pl / bin / x86_64-conda_cos6-linux-gnu-cc: команда не найдена make: *** [/ home / user / anaconda3 / conda -bld / r-matrixstats_1516727877269 / _h_env_placehold_pl / lib / R / etc / Makeconf: 160: 000.init.o] Ошибка 127 ОШИБКА: сбой компиляции для пакета «matrixStats» & quot;
– burton030
24 January 2018 в 09:31
conda skeleton mran r-mice
, которого в настоящее время не существует?
– brimborium
12 March 2018 в 18:54
.libPaths
для установки пути, по которому вы хотите установить пакеты, если вы передадите ему аргумент; см.?.libPaths
. – alistaire 15 April 2016 в 18:06install.packages
в ячейке Jupyter:install.packages('package name', 'installation path (ending with Anaconda3\R\library\learningr)', repo='repo link. Check https://cran.r-project.org/mirrors.html')
.repo
существует, поскольку репо необходимо указывать при установке пакетов в Jupyter, иначе он выдает ошибкуtrying to use CRAN without setting a mirror
. – seismatica 6 December 2017 в 12:28