R, которые используют функцию & lt; - function [duplicate]

Я искал ту же проблему и наткнулся на следующий код.

Как получить MAC-адрес клиента (Web):

Чтобы получить MAC-адрес клиента только так, может полагаться на управление JavaScript и Active X на Microsoft.It работает только в IE, если Active X разрешает IE. Поскольку ActiveXObject недоступен в Firefox, он не работает с firefox и отлично работает в IE.

Этот скрипт предназначен только для IE:

<script language="javascript" type="text/javascript">
    function showMacAddress() {
        var obj = new ActiveXObject("WbemScripting.SWbemLocator");
        var s = obj.ConnectServer(".");
        var properties = s.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration");
        var e = new Enumerator(properties);
        var output;
        output = '<table border="0" cellPadding="5px" cellSpacing="1px" bgColor="#CCCCCC">';
        output = output + '<tr bgColor="#EAEAEA"><td>Caption</td><td>MACAddress</td></tr>';
        while (!e.atEnd()) {
            e.moveNext();
            var p = e.item();
            if (!p) continue;
            output = output + '<tr bgColor="#FFFFFF">';
            output = output + '<td>' + p.Caption; +'</td>';
            output = output + '<td>' + p.MACAddress + '</td>';
            output = output + '</tr>';
        }
        output = output + '</table>';
        document.getElementById("box").innerHTML = output;
    }
</script>
41
задан Ari B. Friedman 17 March 2013 в 12:23
поделиться

3 ответа

Когда вы вызываете

cutoff(x) <- 65

, вы фактически вызываете

x <- "cutoff<-"(x = x, value = 65)

Имя функции должно быть указано как синтаксически действительное, но нестандартное имя и синтаксический анализатор интерпретируют <- как оператор не как часть имени функции, если он не был указан.

"cutoff<-"() подобен любой другой функции (хотя и с странным именем); он меняет свой входной аргумент на основе value (в этом случае он устанавливает любое значение в x больше, чем 65 на Inf (бесконечное)).

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

cutoff(x) <- 65

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

В более общем плане мы имеем

FUN(obj) <- value

R находит функцию "FUN<-"() и устанавливает вызов, передавая obj и value в "FUN<-"() , а упорядочивает результат "FUN<-"(), который будет назначен на obj, поэтому он вызывает:

obj <- "FUN<-"(obj, value)

Полезной ссылкой для этой информации является раздел определения языка g0] R 3.4.4: Назначение подмножества ; дискуссия немного наклонная, но, по-видимому, она является самой официальной ссылкой (функции замены упоминаются в распространении часто задаваемых вопросов R (различия между R и S-PLUS) и в справочной системе R (различные технические проблемы), но я не нашел дальнейшего обсуждения в официальной документации).

43
ответ дан Ben Bolker 21 August 2018 в 13:37
поделиться
  • 1
    очень очень полезный ответ ... Большое спасибо. – Sam 19 July 2012 в 16:02

Гэвин отлично обсуждает интерпретацию функции замены. Я хотел бы предоставить ссылку, так как вы также просили об этом: Определение языка R Раздел 3.4.4: Назначение подмножества .

10
ответ дан Brian Diggs 21 August 2018 в 13:37
поделиться

Помните, что в R вся операция - вызов функции (следовательно, также операции присваивания), и все, что существует, является объектом. Замещающие функции действуют так, как будто они изменяют свои аргументы на месте, например, в

colnames(d) <- c("Input", "Output")

. Они имеют идентификатор <- в конце своего имени и возвращают измененную копию объекта аргумента (не примитивный функции замены) или тот же объект (примитивные функции замены)

В приглашении R следующее действие не будет работать:

> `second` <- function(x, value) {
+   x[2] <- value
+   x
+ }
> x <- 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> second(x) <- 9
Error in second(x) <- 9: couldn't find function "second<-"

Как вы можете видеть, R выполняет поиск в среде не для second, а для second<-. Итак, давайте делать то же самое, но вместо этого используем такой идентификатор функции:

> `second<-` <- function(x, value) {
+   x[2] <- value
+   x
+ }

Теперь задание во второй позиции вектора работает:

> second(x) <- 9
> x
 [1]  1  9  3  4  5  6  7  8  9 10

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

2
ответ дан TMOTTM 21 August 2018 в 13:37
поделиться
  • 1
    – Manuel S 14 May 2016 в 17:04
  • 2
    @ManuelS Я проверяю: > split<-.data.frame Fehler: Objekt '.data.frame' nicht gefunden > split<-.default Fehler: Objekt '.default' nicht gefunden > – TMOTTM 17 May 2016 в 18:04
  • 3
    @ManuelS Хэдли ничего не писал о таких названных функциях в Advanced R. У вас есть ссылка на функции, которые вы упомянули? – TMOTTM 17 May 2016 в 18:13
  • 4
    Вы должны называть их обратными окнами, например. `split<-.data.frame`. Чтобы извлечь их, см. мой вопрос – Manuel S 18 May 2016 в 08:35
Другие вопросы по тегам:

Похожие вопросы: