Я искал ту же проблему и наткнулся на следующий код.
Как получить 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>
Когда вы вызываете
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 (различные технические проблемы), но я не нашел дальнейшего обсуждения в официальной документации).
Гэвин отлично обсуждает интерпретацию функции замены. Я хотел бы предоставить ссылку, так как вы также просили об этом: Определение языка R Раздел 3.4.4: Назначение подмножества .
Помните, что в 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, найти его здесь .
> split<-.data.frame Fehler: Objekt '.data.frame' nicht gefunden > split<-.default Fehler: Objekt '.default' nicht gefunden >
– TMOTTM
17 May 2016 в 18:04
`split<-.data.frame`
. Чтобы извлечь их, см. мой вопрос
– Manuel S
18 May 2016 в 08:35