diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java
index 8178d4c0276ae70944915079cd7754463b8c30b2..bd79d8d202587cb25d2552d0c60ec6e3312779a5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java
@@ -22,6 +22,8 @@
  */
 package com.oracle.truffle.r.runtime.data;
 
+import com.oracle.truffle.r.runtime.RRuntime;
+
 /**
  * Internally GNU R distinguishes "strings" and "vectors of strings" using the {@code CHARSXP} and
  * {@code STRSXP} types, respectively. Although this difference is invisible at the R level, it
@@ -32,6 +34,8 @@ package com.oracle.truffle.r.runtime.data;
  * N.B. Use limited to RFFI implementations.
  */
 public final class CharSXPWrapper extends RObject implements RTruffleObject {
+    private static final CharSXPWrapper NA = new CharSXPWrapper(RRuntime.STRING_NA);
+
     private String contents;
 
     private CharSXPWrapper(String contents) {
@@ -48,7 +52,11 @@ public final class CharSXPWrapper extends RObject implements RTruffleObject {
     }
 
     public static CharSXPWrapper create(String contents) {
-        return new CharSXPWrapper(contents);
+        if (contents == RRuntime.STRING_NA) {
+            return NA;
+        } else {
+            return new CharSXPWrapper(contents);
+        }
     }
 
     public long allocateNativeContents() {