แพ็คเกจ R พร้อมรหัส C 'ไม่มีสัญลักษณ์ดังกล่าว' ในแพ็คเกจ dll

Aug 20 2020

ฉันกำลังเขียนแพ็คเกจ R และเริ่มรวมรหัส C ไว้ในนั้น ปฏิบัติตามคำแนะนำจากที่นี่ภายใต้หัวข้อ "การเริ่มต้นกับและ C ()" ผมสร้างฟังก์ชั่น AC ใน src / และ R @useDynLib(<package-name>, <name_of_c_function>)เสื้อคลุมให้มันเชื่อมโยงผ่านทางแท็ก

อย่างไรก็ตามหลังจากเรียกใช้devtools::document()ฉันได้รับข้อผิดพลาดต่อไปนี้:

Error in FUN(X[[i]], ...) :
  no such symbol <name_of_c_function> in package C:/path/to/package/src/<package-name>.dll

ฉันอ่านว่าการอัปเดต R และ Rtools ได้แก้ไขปัญหาสำหรับบางคนแล้ว ฉันได้อัปเดตทั้งสองรายการเมื่อวานนี้ แต่ก็ไม่เป็นประโยชน์

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมมาก

(ซึ่งคล้ายกับปัญหาในคำถามนี้ซึ่งยังไม่มีคำตอบในขณะนี้)

(อาจเกี่ยวข้องกับคำถามนี้ด้วยยกเว้นว่าฉันใช้ devtools :: document () แทน R CMD ในคำถามนั้น)


รหัสที่เกี่ยวข้อง:

# R file
#' @useDynLib <package-name> <name_of_c_function>
#' @export
name_of_func <- function(y) {
  stopifnot(is.numeric(y))
  .C(name_of_c_function, y,y,length(y),1) [[2]]
}
// C file
<#include stdlib.h>
static void name_of_c_function(double* y, double* x, 
const unsigned int length, const double a) {...}

คำตอบ

bert Aug 20 2020 at 16:41

ปรากฎว่าปัญหาอยู่ในบรรทัดนี้

static void name_of_c_function(...){...}

ดังที่กล่าวไว้ในโพสต์นี้ว่า

คีย์เวิร์ดแบบคงที่ค่อนข้างใช้มากเกินไป เมื่อนำไปใช้กับฟังก์ชันหมายความว่าฟังก์ชันนั้นมีการเชื่อมโยงภายในกล่าวคือขอบเขตของฟังก์ชันจะ จำกัด อยู่ภายในหน่วยการแปล (เพียงแค่เป็นไฟล์ต้นฉบับ)

กล่าวอีกนัยหนึ่งคำสำคัญ "คงที่" ทำให้ฟังก์ชันไม่สามารถเรียกใช้จากภายนอกหน่วยของตัวเองได้อีกต่อไปจึงทำให้เกิดข้อผิดพลาด "ไม่มีสัญลักษณ์ดังกล่าว"

การลบคีย์เวิร์ด "คงที่" จะช่วยแก้ปัญหาได้