Для непримитивных функций база R включает в себя функцию, называемую body()
, которая возвращает тело функции. Например, источник функции print.Date()
можно просмотреть:
body(print.Date)
выдает следующее:
{
if (is.null(max))
max <- getOption("max.print", 9999L)
if (max < length(x)) {
print(format(x[seq_len(max)]), max = max, ...)
cat(" [ reached getOption(\"max.print\") -- omitted",
length(x) - max, "entries ]\n")
}
else print(format(x), max = max, ...)
invisible(x)
}
Если вы работаете в скрипте и хотите, чтобы код функции как символ символа, вы можете получить его.
capture.output(print(body(print.Date)))
доставит вам:
[1] "{"
[2] " if (is.null(max)) "
[3] " max <- getOption(\"max.print\", 9999L)"
[4] " if (max < length(x)) {"
[5] " print(format(x[seq_len(max)]), max = max, ...)"
[6] " cat(\" [ reached getOption(\\\"max.print\\\") -- omitted\", "
[7] " length(x) - max, \"entries ]\\n\")"
[8] " }"
[9] " else print(format(x), max = max, ...)"
[10] " invisible(x)"
[11] "}"
Зачем мне это делать? Я создал пользовательский объект S3 (x
, где class(x) = "foo"
) на основе списка. Один из участников списка (называемый «fun») был функцией, и я хотел print.foo()
отобразить исходный код функции с отступом. Таким образом, я получил следующий фрагмент в print.foo()
:
sourceVector = capture.output(print(body(x[["fun"]])))
cat(paste0(" ", sourceVector, "\n"))
, который отступы и отображает код, связанный с x[["fun"]]
.
У вас могут быть столбцы в массиве, которые определяют hidden: true, а затем просто проходят через массив столбцов и показывают / скрывают столбцы непосредственно перед экспортом следующим образом:
function excelExport(e) {
if (!exportFlag) {
for(var i=0; i < columns.length; i++) {
if(columns[i].hidden)
e.sender.showColumn(i);
}
e.preventDefault();
exportFlag = true;
setTimeout(function () {
e.sender.saveAsExcel();
});
} else {
for(var i=0; i < columns.length; i++) {
if(columns[i].hidden)
e.sender.hideColumn(i);
}
exportFlag = false;
}
}
Я искал для достижения подобной вещи и использовал ответ, предоставленный @Ankur, с небольшими изменениями, поскольку мне нужно было снова скрыть столбцы после экспорта.
Код выглядит следующим образом:
excelExport(e) {
Spa.startLoading(); // loading overlay to hide the columns showing then hiding again
var columns = e.sender.columns;
var hiddenColumnNumbers = [];
if (!exportFlag) {
for (let i = 0; i < columns.length; i++) {
if (columns[i].hidden) {
e.sender.showColumn(i);
hiddenColumnNumbers.push(i);
}
}
e.preventDefault();
exportFlag = true;
setTimeout(() => {
e.sender.saveAsExcel();
for (let j = 0; j < columns.length; j++) {
if (hiddenColumnNumbers.indexOf(j) > -1) {
e.sender.hideColumn(j);
}
}
Spa.stopLoading(); // hide loading overlay
});
} else {
for (let k = 0; k < columns.length; k++) {
if (columns[k].hidden)
e.sender.hideColumn(k);
}
exportFlag = false;
Spa.stopLoading(); // hide loading overlay
}
},
Вы можете добавить некоторый javascript для управления этим.
var exportFlag = true;
$("#gridName").data("kendoGrid").bind("excelExport", function (e) {
if (exportFlag) {
e.sender.showColumn("hiddenColumnName");
e.preventDefault();
exportFlag = false;
e.sender.saveAsExcel();
} else {
e.sender.hideColumn("hiddenColumnName");
exportFlag = true;
}
});
В основном это ловит событие excelExport
, когда вы нажимаете кнопку «Экспорт» и показывает скрытый столбец в своей сетке, прежде чем он запустит saveAsExcel()
, которая сохраняет ваш документ. Затем он снова скрывает столбец.
hidden
true
или false
. Я сделаю некоторые исследования, чтобы понять, могу ли я это понять. Что не так с этим примером? В сетке есть 3 столбца, а третий столбец скрыт. Когда вы нажимаете кнопку «Экспорт», он показывает скрытый столбец в документе excel.
– Supersnake
18 July 2016 в 17:23