niszetの日記

細かい情報を載せていくブログ

niszetの各ページへのリンク集

暫定的に。GitHub上に書いた方がよいかも知れないけども。

niszet名義で登録しているもののリスト。

ツイッターアカウント。ツイ廃なので最低限RTはミュート推奨

twitter.com

作ったまま放置のますとどんアカウント。

mstdn.jp

GitHubアカウント。あんまり公開しているリポジトリはない。

github.com

YouTubeチャンネル。動画は少ない。

www.youtube.com

Qiita。記事の投稿はない。

qiita.com

Zenn。こちらも読むだけ。

zenn.dev

Twitch。2022年末時点でスプラ3の配信をしたりしなかったり。

www.twitch.tv

ShinyLiveを安定利用するにはまだちょっと早かったようだ

WebRの完成が待たれる。

Shinyアプリを、Shiny Serverなしで動かすことが出来る。そんな素敵な仕組みが開発されています。ShinyLiveという名前で、RやShinyで書かれたコードを変換し、ブラウザ上で動作出来るようにするといったもの(良くわかってませんが…

github.com

今、quartoでサイトを作ってるのですが、shiny的な、インタラクティブに扱いたい物があるものの、Shiny Serverもないしなぁといったところで、朗報だったのですが…

github.com

こちらは既に解決してcloseされていますが、ShinyLiveが依存しているWebRの状況によって、ShinyLiveやサイト自体に変更がなくても動作しなくなることがあることがわかりました。

このあと、動作はしたものの、翌々日にはまた別の理由で動かなくなってしまい、公開できるような状態に持って行くのはまだ難しいなぁ、というところです。

ただ、色々と使い方はわかってきたので、ぼちぼちこちらのブログの再開とともに、ネタを投下していこうと思います。quartoも、沢山知見は溜まりましたしね。

ということで、やっていきましょう。

(R)アルファベットが連続したベクトルが欲しい(小ネタ)

最初躓きますよね?

Rの最初の最初、ベクトルとはどんなものかみたいな話からはじまって、

seq(1,5)
# [1] 1 2 3 4 5

とか、

rep(1,5)
# [1] 1 1 1 1 1

とかで、わーい!ってやっていた時期があると思います。で、seq(1,5)の代わりに1:5でもいけるよ!すげーじゃん!!

で、じゃあアルファベットも・・・って試して、

"a":"z"
#  "a":"z" でエラー:  引数が NA/NaN です 
#  追加情報:  警告メッセージ: 
# 1:  強制変換により NA が生成されました  
# 2:  強制変換により NA が生成されました  

あると思います。

lettersを使う

baseパッケージに、lettersというデータがあるので、これを使います。これが正解。あと、大文字でLETTERSもある。

letters
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

全てのアルファベットについてチェックしようとかいう場合は、c(letters,LETTERS)でつなげればよろしい。

あと余談ですが、:も関数なので、:(1,5) で 1:5 と同じ結果になりますし、ベクトルなので、要素をインデックスで指定して

letters[c(1,26,26,1)]
# [1] "a" "z" "z" "a"

みたいになりますね。

なんか思いついた場合

C言語とかで文字を扱う場合、文字コードがaからzまで連番だから・・・という考え方で、上記のような連番生成できるんじゃないの?みたいな考えになりますよね。

じゃあそれでやってみるか。とはいえ、文字から数字への変換はNAになってしまうし...というところでハマりがちですが、Rにはraw型があります。ただ、文字からrawへの変換はcharToRawなので注意が必要ですね。

charToRaw("a")
# [1] 61
as.integer(charToRaw("a"))
# [1] 97

raw型は出力が16進数であらわされているのに注意です。10進数にするにはas.integerです。:はraw型を受け付けてくれないので、このように一旦integerにして、それを使い、raw型に戻し、rawからcharへの変換をかけます。

つまり、以下のようになります。

rawToChar(as.raw(`:`(as.integer(charToRaw("a")),as.integer(charToRaw("z")))), multiple = T)
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

ここで、rawToCharに引数multiple = Tを与えないと、文字がすべて結合されてしまうため注意。

一応、一致を確認してみると、

identical(letters, rawToChar(as.raw(`:`(as.integer(charToRaw("a")),as.integer(charToRaw("z")))), T))
# [1] TRUE

となり、ちゃんと生成できましたね。

めでたしめでたし。

(Pandoc)docx出力時、テンプレートのとじしろの設定が反映されるようになった

バグの解消

Pandocはテンプレートのスタイルなどを使って、生成するファイルの見栄えを制御出来ますが、Pandocがテンプレートとなるファイルからその情報を抜き出すように処理を書いているものだけが対応していて、全ての設定が反映されるわけではありません(が、概ね反映されるはず)

Pandoc 3.1.6より、ページ設定の余白のとじしろが反映されていないバグが修正されました。

github.com

こういった細かいバグはまだあると思いますので、見つけたらpandoc-discussやPandocのIssueにどんどん報告していきましょう!

(Pandoc)docx出力形式でもsvgファイルを使うことが出来るようになった

Pandoc 3.1.10より。

以前から機能的には出来そうな雰囲気であったが、バグがありそれが対応された結果、docxファイルにsvg画像を使えるようになった。

対応するIssueはこれ。

github.com

svgファイルを取り扱うにはpandoc本体とは別にrsvg-convertが必要になる。linux環境であれば、librsvgを入れればよいでしょう。

qiita.com

Windowsの場合はpandocのinstallのマニュアルにあるようにChocolateyを使うのが良さそう。Pandocも入れられる。

pandoc.org

有償版もあるが、コミュニティ版?でも大丈夫。

community.chocolatey.org

PowerShellのターミナルを管理者権限で実行し、以下の手順に従ってインストールするだけ。

chocolatey.org

その後、choco install rsvg-convertでインストールできる。pandocもchoco install pandocでインストールされるのは最新のバイナリだった。

PowerShell上でパスが通ってるかはこちらで確認できる。gcm rsvg-convertとか gcm pandocで確認できる。

win.just4fun.biz

Chocolateyでインストールした物もパスは通っているので、cmdやRMarkdown/qmdからも見えるため、あとは普通にPandocでsvgファイルを含んでいるmarkdownファイルを変換してあげればよい。

rsvg-convertはsvgを扱う上では現状でば最適ぽいので、他の用途でも問題なく使えるだろう。下記の記事も参考にした。

qiita.com

PowerShellでWord文書をpdfに変換する際に参考にしたサイト

少しだけトラブったのでメモを残します。

Wordからpdfファイルを生成する際、手でやるのは大変なのでバッチでやりたいと考えました。Windows上での使用が前提なので、PowerShellで記述例がないかを探していました。下記の記事のコードがほぼそのまま利用できました(tmpディレクトリはワーキングディレクトリに変更した)

projectgroup.info

このコードを実行する際、このシステムではスクリプトの実行が無効になっているため、...というエラーが出ました。権限の問題のようで、調べて下記の記事にあたり、実行ポリシーを変更しました(-Scope Processを指定する方法です)。この前に管理者権限での実行もしましたがうまくいかず(変更後は試していません)

qiita.com

この変更により実行可能となりましたが、今度は以下のエラーとなりました。

"Visible" の設定中に例外が発生しました: "型 'Microsoft.Office.Interop.Word.ApplicationClass' の COM オブジェクトをイン
ターフェイス型 'Microsoft.Office.Interop.Word._Application' にキャストできません。IID '{00020970-0000-0000-C000-0000000
00046}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため
、この操作に失敗しました: 要素が見つかりません。 (HRESULT からの例外:0x8002802B (TYPE_E_ELEMENTNOTFOUND))。"

このエラーの内容で検索して、下記の記事にあたり、上から試そうとしたところ、最上段のOfficeの修復の対応で問題が解決しました。

elleneast.com

これは割とあるエラーのようで、エクセルなどでもヒットしますね。

qiita.com

Officeの修復については下記のページにある手順で進めました。

support.microsoft.com

クイック修復で直りました。数分待ちます。

最初の記事にあるcmdからbatを呼ぶ方法では権限の設定を変える必要があったので、そちらはやらず、これらを設定後、PowerShellを起動し、対象のディレクトリ上で.\mkpdf.ps1のように.\をファイル名に付けた状態で実行して実行できることを確認しました。 また、ps1のファイルを右クリックしてpowershellで実行でも同様に動くことを確認しました。

今のところ完全自動でやる必要まではないのですが、完全自動でやる場合は権限の変更が追加で必要かと思っています。ひとまず出来たので、至った手順とトラブルについてまとめておきました。