Как интерпретировать VBA со структурой функций в код R через RDCOMClient?

Контекст: я использую R для обработки данных, которые затем экспортирую в Excel и создаю столбчатую диаграмму.

Проблема. До сих пор было относительно легко записать макрос Excel VBA, а затем преобразовать его в код R с помощью пакета RDCOMClient. Однако я не понимаю, как интерпретировать структуру функции VBA «с».

Вопрос. Я хотел бы перевести следующий код Excel VBA в код R (в частности, с помощью пакета RDCOMClient):

' Activate barchart
ActiveSheet.ChartObjects("Chart 1").Activate

' Select the Male data column
ActiveChart.SeriesCollection(1).Select

' Change the colour of the Male bars in the barchart
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent1
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0
    .Solid
End With

Воспроизводимый код. Следующий код R создаст на листе Excel столбчатую диаграмму.

# Load package and helper functions - see http://www.omegahat.org/RDCOMClient
require(RDCOMClient)
source("http://www.omegahat.org/RDCOMClient/examples/excelUtils.R")

# Create Excel application
xls <- COMCreate("Excel.Application")

# Make Excel workbook visible to user
xls[["Visible"]] <- TRUE

# Add a worksheet to the workbook
wb = xls[["Workbooks"]]$Add(1)

# Add data.frame to worksheet (Hishest Qualification of Job Applicants by Sex)
df <- data.frame(Degree=c("BSc", "MSc", "PhD"), Male=c(322, 107, 39), Female=c(251, 128, 25))
exportDataFrame(df, at = wb$ActiveSheet()$Range("A1"))

# Add Chart
chart.display.range <- wb$ActiveSheet()$Range("E2:M20")
wb$ActiveSheet()$Range("A1:C4")$Select()
wb$ActiveSheet()$Shapes()$AddChart(Top = chart.display.range$Top(), 
                                   Left = chart.display.range$Left(), 
                                   Height = chart.display.range$Height(), 
                                   Width = chart.display.range$Width())$Select()

Что я сделал на данный момент: первые две строки кода VBA легко перевести на R:

# Activate chart
wb$ActiveSheet()$ChartObjects("Chart 1")$Activate()

# Select the Male data column
male <- wb$ActiveChart()$SeriesCollection(1)
male$Select()

А затем для структуры with

# bar colour to be changed (this is a guess)
bar <- male$Selection()$Format()$Fill()

что приводит к следующей ошибке:

#Error in .COM(x, name, ...) : 
# Cannot locate 0 name(s) Selection in COM object (status = -2147352570)

Что я интерпретирую как «Выбор», не следует использовать? Я не уверен, куда идти дальше, но я думаю, что как только я исправлю ошибку выше, я сделаю что-то вроде следующего:

bar[["Visible"]] = 1
bar[["ForeColor"]][["ObjectThemeColor"]] = 5
bar[["ForeColor"]][["TintAndShade"]] = 0
bar[["ForeColor"]][["Brightness"]] = 0

Заранее спасибо!

P.S. Я знаю, что может быть возможность экспортировать график R в Excel, но меня больше интересует попытка выяснить, как интерпретировать структуру функции «с».

P.P.S Я использую Windows 7 x64, x86_64-w64-mingw32/x64 (64-разрядная версия), R 3.0.1, RDCOMClient_0.93-0.1


person Tony Breyal    schedule 04.10.2013    source источник
comment
Я никогда не работал с R и отсюда глупый вопрос... Поддерживает ли R вообще With Contsruct? Если нет, то вы можете использовать несколько строк вместо выделения... ActiveChart.SeriesCollection(1).Format.Fill.Visible = msoTrue и так далее...   -  person Siddharth Rout    schedule 04.10.2013
comment
@SiddharthRout Ааа, интересно, вот что значит структура. Да, то, что вы предлагаете, тоже сработает, то есть x = wb$ActiveChart()$SeriesCollection(1)$Format()$Fill(), а затем x[["Visible"]] = 1. Спасибо.   -  person Tony Breyal    schedule 04.10.2013
comment
Что касается стиля, хотя Excel часто использует их при автогенерации кода, ActiveWorkbook и ActiveWorksheet опасны. Лучше назвать конкретную книгу или рабочий лист. Например, если у вас есть долго выполняющийся макрос, а затем начните работать с другой электронной таблицей, активная рабочая книга изменится на другую вещь, над которой вы работаете, и все сломается.   -  person Richie Cotton    schedule 04.10.2013
comment
@RichieCotton Очень хорошее замечание, и я обязательно сделаю это в будущем.   -  person Tony Breyal    schedule 04.10.2013


Ответы (1)


Do

bar <- male$Format()$Fill()

Вместо

bar <- male$Selection()$Format()$Fill()
person JoshuaCrove    schedule 04.10.2013
comment
Га, ты меня опередил! - person Richie Cotton; 04.10.2013
comment
+ 1 Я не понимаю R код, но кажется, что ваш код работает так хорошо: p - person Siddharth Rout; 04.10.2013